0

我的产品模型中有以下方法:

def has_feature? (feature_name)
  self.features.where(:name=>feature_name).present?
end

这似乎很慢。有没有更好的方法来检查我的产品是否具有给定名称的功能?

4

2 回答 2

1

另一种编写方法是在Feature模型中使用范围,看看它是否有帮助并present?对该范围的结果输出进行操作

scope :includes_feature, lambda{ |feature|
  { :name => feature }
}

所以最后你能做的是product.features.includes_feature(feature_name)

于 2013-09-20T21:34:00.537 回答
1

.present?不是返回的标准ActiveRecord::Relation方法where。调用.present?是获取具有给定名称的所有功能,更改为数组,然后调用.present?数组。

如果您.exists?改为调用,则执行的数据库查询会稍微优化以检查该功能是否存在。

但是,我不确定您是否会注意到这两个选项之间的性能差异。最可能的原因是您缺少数据库索引。假设您的关联是Product has_many :features将生成的数据库查询将通过在features.product_id和上的索引来改进features.name

于 2013-09-20T21:37:06.487 回答