Как получается, что find_by_id и т. Д. Работают с массивом ActiveRecord? - PullRequest
1 голос
/ 06 октября 2010

Простите, если я неправильно понял мою терминологию;Я все еще новичок в Ruby и Rails.

В школе я работаю над проектом RoR как часть команды.Я занимался парным программированием с товарищем по команде, который действительно имеет опыт работы в RoR;и я написал что-то вроде следующего:

d = self.deliverables.find_all_by_lifecycle_id(self.lifecycle_id)

Мой партнер по программированию пар остановил меня на этом этапе и объяснил, что это не сработает, потому что find_all_by_lifecycle_id может быть успешно разрешено только при вызове Deliverable модель, которая наследуется от ActiveRecord::Base (которая, в свою очередь, является классом, отвечающим за предоставление такой магической функциональности).Метод self.deliverables возвращает массив , который не обладает такими же возможностями.Альтернативное решение, которое он предложил, состояло в том, чтобы использовать именованную область действия .

. Я запротестовал: "Но ... я почти уверен, что уже пробовал это уже ...и это сработало . "

Конечно же, оно действительно , кажется, работает, как мы обнаружили, когда мы проверяли это, просто чтобы меня развеселить.Чего не хватало моему товарищу по команде?У меня, конечно, нет опыта, чтобы понять, что могло быть не так в том, что он сказал (это имело смысл для меня).

1 Ответ

2 голосов
/ 06 октября 2010

Я так понимаю, self.deliverables определяется ассоциацией :has_many. В данном случае это не просто массив. Некоторые вещи, которые вы можете сделать с такой коллекцией, выделены в официальном руководстве по рельсам . В частности, проверьте часть 4.3.1.10 collection.find (…) :
Метод collection.find находит объекты в коллекции. Он использует тот же синтаксис и параметры, что и ActiveRecord :: Base.find.

В нем явно не упоминается синтаксис find_by_xxx, но, как и вы, я обнаружил, что он работает на практике.

...