Rails,模型中的finder(使用collect)或控制器(迭代和使用push).哪个更有效率?

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)

Dyl*_*kow 6

您可以直接在数据库中执行此操作:

@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)