Rails, поиск в модели (используя collect) или в контроллере (итерирование и использование push).Что является более эффективным? - PullRequest
4 голосов
/ 16 ноября 2011

, который ниже, более эффективен для выполнения этой задачи. Я хочу пройтись по модели, проверить, не превышает ли список, составленный из целочисленных значений, связанных с каждым идентификатором 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)

Ответы [ 4 ]

6 голосов
/ 16 ноября 2011

Вы можете просто сделать это в базе данных напрямую:

@models = Model.find(:all, :conditions => ["id in (?)", modellist.select{ |i| i && i > 0}])

Или более короткая версия:

@models = Model.find(modellist.select{ |i| i && i > 0})
2 голосов
/ 16 ноября 2011

Предполагая, что ваши modellist и pList уже существуют и являются Hash, вы можете отфильтровать их ранее и использовать find с массивом:

@models = Model.find(modellist.reject {|k, v| v < 1} .keys)

То же самое со вторым примером:

@pictures = Picture.find(pList.reject {|k, v| v > 0} .keys)

Таким образом, вы не будете зацикливаться на всей своей базе данных.

1 голос
/ 16 ноября 2011

Глупо хранить значения в индексируемом массиве, потому что вы не можете манипулировать им, не изменяя индексы и не убирая все идентификаторы.

ids = []
modellist.each_index{|i| ids << i if modelist[i] > 0}
@models = Model.find ids

Если моделлист был хешем:

@models = Model.find modellist.select{|k,v| v > 0}.keys
1 голос
/ 16 ноября 2011

Почему бы не отобразить массив списков моделей и извлечь индексы / ключи со значениями, не равными 0, и передать этот массив идентификаторов в Искатель моделей?

(шуршит какой-то код, но я не перед моим компьютером)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...