1

我的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

我已经尝试了 2 个小时,但无法弄清楚(没有完全编写新查询)。我不知道如何feature从关系中访问表的字段Product.features,因为它似乎只能过滤product_features字段。

到目前为止,这是我想出的:

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

但它只是说feature这不是一个有效的方法,我理解。

编辑

我已经更新了我的模型,因此关系更加清晰:

产品.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

特征.rb

class Feature < ActiveRecord::Base
  attr_accessible :name, :compare
end

我希望能够查询product_features属于 aproductfeaturewhere Feature.compareis 的true。像这样的东西:

产品.rb

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

这会引发错误,因为compareFeature模型中,不是ProductFeature. 我在 product_feature.rb 中尝试了以下内容:

delegate :compare, :to => :feature

但我没有帮助。

我将在几个小时内为此添加赏金,所以请帮助我!

4

3 回答 3

2

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.

于 2013-01-23T10:51:33.800 回答
1

这似乎是一个 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"})
于 2013-01-20T23:18:35.610 回答
0

@product.each |p| { p.features.where(:comparable => true) }可能是您在这里最好的选择,但我愿意接受启蒙。

于 2013-01-20T23:20:50.893 回答