2010-08-23 1 views
10

Ich muss Namensbereich mit oder Betreiber ... So etwas kombinieren:Rails3: Kombinieren Umfang mit OR

class Product < ActiveRecord::Base 
    belongs_to :client 

    scope :name_a, where("products.name = 'a'") 
    scope :client_b, joins(:client).where("clients.name = 'b'") 

    scope :name_a_or_b, name_a.or(client_b) 
end 

Thx

Antwort

9

Von Arel documentation

Der OR Betreiber nicht ist noch unterstützt. Es wird wie folgt funktionieren: users.where(users[:name].eq('bob').or(users[:age].lt(25)))

This RailsCast zeigt Ihnen, wie Sie den .or Operator verwenden. Es funktioniert jedoch mit Arel-Objekten, während Sie Instanzen von ActiveRecord::Relation haben. Sie können eine Beziehung zu Arel mit Product.name_a.arel konvertieren, aber jetzt müssen Sie herausfinden, wie die Bedingungen zusammengeführt werden.

8

Heres ein Hack, den ich benutzen würde mit diesem fehlenden Feature umgehen:

class Product < ActiveRecord::Base 
    belongs_to :client 

    class << self 
    def name_a 
     where("products.name = 'a'") 
    end 

    def client_b 
     joins(:client).where("clients.name = 'b'") 
    end 

    def name_a_or_b 
     clauses = [name_a, client_b].map do |relation| 
     clause = relation.arel.where_clauses.map { |clause| "(#{clause})" }.join(' AND ') 
     "(#{clause})" 
     end.join(' OR ') 

     where clauses 
    end 
    end 
end 
+0

Genius! Vielen Dank –

3

Für Rails 3:

Person.where(
    Person.where(name: "John").where(lastname: "Smith").where_values.join(' OR ') 
)