我在我的Product
模型中有这个关系:
has_many :features, :class_name => 'ProductFeature', :source => :product_feature, :include => :feature
我可以写Product.features
可以正常工作。但我希望能够过滤字段在feature
表,当和必要时。例如在伪代码中:
find all product features where feature is comparable
compare
是feature
上的bool字段。
我已经尝试了2个小时,不能弄清楚(没有写一个新的查询完全)。我不知道如何从Product.features
关系中访问feature
表的字段,因为它似乎只能过滤product_features
字段。
这是我目前想到的:
def features_compare
features.feature.where(:compare => true)
end
但它只是说feature
不是一个有效的方法,我理解。
我已经更新了我的模型,所以关系更清楚:
product.rb:
class Product < ActiveRecord::Base
belongs_to :company
belongs_to :insurance_type
has_many :product_features
has_many :reviews
attr_accessible :description, :name, :company
end
product_feature.rb:
class ProductFeature < ActiveRecord::Base
belongs_to :product
belongs_to :feature
delegate :name, :to => :feature
attr_accessible :value
end
feature.rb
class Feature < ActiveRecord::Base
attr_accessible :name, :compare
end
我希望能够查询属于product
和feature
的product_features
,其中Feature.compare
是true
。像这样:
product.rb
def features_compare
product_features.where(:compare => true)
end
这抛出一个错误,因为compare
在Feature
模型中,而不是ProductFeature
。我在product_feature.rb中尝试了以下操作:
delegate :compare, :to => :feature
但我没有帮忙。
我会在几个小时内添加赏金,所以请帮帮我!
标题>find all product features where feature is comparable
只是
ProductFeature.joins(:feature).where(:feature => {:compare => true})
您可以通过引入作用域来使其更易于重用:
#in product_feature.rb
scope :with_feature_like, lambda do |filter|
joins(:feature).where(:feature => filter)
end
#elsewhere
ProductFeature.with_feature_like(:compare => true)
#all the product features of a certain product with at comparable features
some_product.product_features.with_feature_like(:compare => true)
最后,如果您希望所有产品的产品功能都具有可比较的功能,您需要这样做:
Product.joins(:product_features => :feature).where(:feature => {:compare => true})
当然你也可以把它变成Product
上的作用域
这看起来像是一个has_many:through关系。试着修改一下:
has_many :features, :class_name => 'ProductFeature', :source => :product_feature, :include => :feature
:
has_many :product_features
has_many :features, :through => :product_features
只要你的ProductFeature模型有这个:
belongs_to :product
belongs_to :feature
并且您在product_features (product_id, feature_id)上有适当的列,那么您应该能够访问该产品的功能和product和ProductFeature上的所有属性。
看到:
http://guides.rubyonrails.org/association_basics.html the-has_many-through-association
编辑:以下是如何通过特征字段进行过滤。
Product.joins(:features).where(:features => {:name => "Size"})
@product.each |p| { p.features.where(:comparable => true) }
可能是你最好的选择,但我愿意接受启发。