, который ниже, более эффективен для выполнения этой задачи. Я хочу пройтись по модели, проверить, не превышает ли список, составленный из целочисленных значений, связанных с каждым идентификатором model_id, значение 0. Если это так, возьмите соответствующие модели в список моделей.
@models = Model.find(:all).collect{|m| m }.reject{ |i| modellist[i.id] < 1 }
или как это
finalModels = []
Model.find_each do |model|
if modellist[model.id] > 0 #edited
#if modellist[model.id] != 0
finalModels.push( model )
end
end
@models = finalModels
Я склоняюсь ко второму подходу, но я не уверен. Может быть, некоторое понимание того, как .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]
I номер индекса pList соответствует идентификатору картинки для этого. Поэтому мне нужно найти фотографии, где pList [идентификатор изображения] больше 0.
Используется ответ Бенуа Гарретса. Я должен был убедиться, что pList был объявлен pList = Hash.new, а не pList = []. точный запрос, который я использовал, был
@pictures = Picture.find(pList.select {|k, v| v > 0}.keys)