rails / activerecord search нетерпеливо загруженные ассоциации - PullRequest
0 голосов
/ 22 декабря 2009

У меня есть простое утверждение поиска как таковое:

m = MyModel.find(1, :include => :my_children)

с m.mychildren, являющимся массивом; есть ли в любом случае найти конкретную запись в массиве без необходимости перебирать всю вещь. Если я выполню mychildren.find (1), возникнет проблема с новым запросом к БД, которая не имеет смысла, поскольку все они уже загружены

Ответы [ 2 ]

1 голос
/ 22 декабря 2009

Похоже, здесь происходит немного магии Рельсов. Где Enumerable # find переопределяется ActiveRecord :: Base # find в методах, созданных для ассоциаций.

С другой стороны, Enumerable # find имеет псевдоним Enumerable # detect . К сожалению, Enumerable # find / Enumerable # detect имеет синтаксис, существенно отличающийся от ActiveRecord :: Base # find.

Так что вы не можете просто сделать mychildren.find(1), вместо этого вы должны сделать mychildren.detect{|c| c.id == 1}, если хотите избежать повторного попадания в базу данных. Вы также можете рассмотреть возможность расширения Array для более СУХОГО способа сделать это.

class Array 
  def id_find id
    self.detect{|element| element.id == id}
  end
end
0 голосов
/ 22 декабря 2009

Я не совсем уверен, что вы спрашиваете, но вы пробовали выберите :

m.mychildren.select{ |child| child == <<some_statement>> }

Это не повлияет на базу данных, если вы использовали опцию :include, как указано в вашем вопросе.

В качестве альтернативы, если вы знаете номер нужного вам ребенка, вы можете просто использовать

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