2013-04-07 65 views
0

在我的ROR應用程序中,我擁有模型Category,Item,Property和PropertyValuation。 這個想法是一個類別包含項目,一個項目有幾個屬性。 PropertyValuation的目的是存儲特定項目的屬性值。該模型的定義如上:Ruby on Rails:基於幾種條件的模型上的過濾器關聯

class Category < ActiveRecord::Base 
    attr_accessible :name, :description, :parent, :children, :items, :parent_id 

    has_many :children, :class_name => "Category", :foreign_key => "parent_id", :dependent => :nullify 
    belongs_to :parent, :class_name => "Category" 

    has_many :categorizations 
    has_many :items, :through => :categorizations 
end 

class Item < ActiveRecord::Base 
    attr_accessible :name, :description, :property_valuations, :barcode 

    has_many :property_valuations, :dependent => :destroy 
    has_many :properties, :through => :property_valuations 

    has_many :categorizations 
    has_many :categories, :through => :categorizations 

end 

class Property < ActiveRecord::Base 
    attr_accessible :name, :description, :value_type, :unit, :unit_id 

    has_many :property_valuations, :dependent => :destroy 
    has_many :items, :through => :property_valuations 
    has_many :property_ranges, :dependent => :destroy 

    belongs_to :unit 
end 

class PropertyValuation < ActiveRecord::Base  
    attr_accessible :property, :item, :value, :categorization 

    belongs_to :property 
    belongs_to :item 
end 

現在我的問題,我已經成功地設法這樣做是爲了過濾通過名稱類項目:

@category.items.where("lower(items.name) like ?", "%#{params[:keywords].downcase}%") 

但現在我也想過濾取決於這些項目關聯的屬性值。 示例:我想要名稱中包含「foo」的類別項目,並且其中屬性「A」的值爲1,屬性B的值爲2,依此類推。 我該如何實現這樣的查詢?

回答

0

您可以鏈接ActiveRecord範圍,包括where。因此,您可以先限制名稱,然後再鏈接一個where以限制結果。下面這個例子將限制結果,其中財產「A」的值爲1,在你的問題中提到:

keywords = params[:keywords].downcase 
@category.items.where("lower(items.name) like ?", "%#{keywords}%").where(:A => 1) 

您還可以存儲示波器中的變量。例如,如果你想單獨限制由屬性A和B相同的數據集,你可能會做這樣的事情:

keywords = params[:keywords].downcase 
matched_by_name = @category.items.where("lower(items.name) like ?", "%#{keywords}%") 
foo = matches_by_name.where(:A => 1) 
bar = matches_by_name.where(:B => 1) 
+0

但在我的情況下,我收到屬性ID和每個值(精確值,或最小值或最大值),這個想法是動態構建查詢。給定我的模型,我該如何做這個例子:我想要名稱包含「foo」的項目,並且id = 1的屬性值爲2,id = 2的屬性值<10,id = 8的屬性值> 2且值<5? – Rui 2013-04-07 17:56:55