我的产品模型中有以下方法:
def has_feature? (feature_name)
self.features.where(:name=>feature_name).present?
end
这似乎很慢。有没有更好的方法来检查我的产品是否具有给定名称的功能?
我的产品模型中有以下方法:
def has_feature? (feature_name)
self.features.where(:name=>feature_name).present?
end
这似乎很慢。有没有更好的方法来检查我的产品是否具有给定名称的功能?
另一种编写方法是在Feature
模型中使用范围,看看它是否有帮助并present?
对该范围的结果输出进行操作
scope :includes_feature, lambda{ |feature|
{ :name => feature }
}
所以最后你能做的是product.features.includes_feature(feature_name)
.present?
不是返回的标准ActiveRecord::Relation
方法where
。调用.present?
是获取具有给定名称的所有功能,更改为数组,然后调用.present?
数组。
如果您.exists?
改为调用,则执行的数据库查询会稍微优化以检查该功能是否存在。
但是,我不确定您是否会注意到这两个选项之间的性能差异。最可能的原因是您缺少数据库索引。假设您的关联是Product has_many :features
将生成的数据库查询将通过在features.product_id
和上的索引来改进features.name
。