在Rails中过滤关系



我在我的Product模型中有这个关系:

has_many :features, :class_name => 'ProductFeature', :source => :product_feature, :include => :feature

我可以写Product.features

可以正常工作。但我希望能够过滤字段在feature表,当和必要时。例如在伪代码中:

find all product features where feature is comparable

comparefeature上的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

我希望能够查询属于productfeatureproduct_features,其中Feature.comparetrue。像这样:

product.rb

def features_compare
  product_features.where(:compare => true)
end

这抛出一个错误,因为compareFeature模型中,而不是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) }可能是你最好的选择,但我愿意接受启发。

相关内容

  • 没有找到相关文章

最新更新