jac*_*ack 4 activerecord loops ruby-on-rails
以下哪种方式可以更有效地完成此任务.我想循环遍历模型,检查由每个model_id关联的整数值组成的列表是否大于0.如果是,则将相应的模型放入模型列表中.
@models = Model.find(:all).collect{|m| m }.reject{ |i| modellist[i.id] < 1 }
Run Code Online (Sandbox Code Playgroud)
或者像这样
finalModels = []
Model.find_each do |model|
if modellist[model.id] > 0 #edited
#if modellist[model.id] != 0
finalModels.push( model )
end
end
@models = finalModels
Run Code Online (Sandbox Code Playgroud)
我倾向于第二种方法,但我不确定.也许对.collect和.reject如何有效地了解它是多么有效.
我的模型叫做Picture.modellist(或pList)包含与此类似的数据.
[nil,nil,nil,3,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,
nil,nil,7,nil,nil,nil,0,nil,nil,nil,0,0,nil,nil,1,3]
Run Code Online (Sandbox Code Playgroud)
我的pList的索引号对应于此的图片ID.所以我需要找到pList [picture id]大于0的图片.
二手Benoit Garrets的回答.我要做的是确保pList是由pList = Hash.new而不是pList = []声明的.我使用的确切查询是
@pictures = Picture.find(pList.select {|k, v| v > 0}.keys)
Run Code Online (Sandbox Code Playgroud)
您可以直接在数据库中执行此操作:
@models = Model.find(:all, :conditions => ["id in (?)", modellist.select{ |i| i && i > 0}])
Run Code Online (Sandbox Code Playgroud)
或者更短的版本:
@models = Model.find(modellist.select{ |i| i && i > 0})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
560 次 |
| 最近记录: |