использование объекта вместо идентификатора в Rails 3.1 вызов для создания - PullRequest
0 голосов
/ 04 января 2012

Я использую Rails 3.1.3 и Ruby 1.9.2 и сталкиваюсь с ошибкой при создании начальных данных в моей базе данных.Я создаю простое приложение для сбора вин, и у меня есть класс Grape с двумя простыми экземплярами (name это "красный" или "белый").У меня есть класс Varietal, который belongs_to класс Grape, а также имеет простое поле name.

Когда я создаю исходные данные, я использую код, подобный следующему:

# create some reds
r = Grape.find_or_create_by_name('Red')
Varietal.find_or_create_by_name_and_grape_id('Cabernet Franc', r)
Varietal.find_or_create_by_name_and_grape_id('Cabernet Sauvignon', r)
Varietal.find_or_create_by_name_and_grape_id('Malbec', r)

# create some whites
w = Grape.find_or_create_by_name('White')
Varietal.find_or_create_by_name_and_grape_id('Chardonnay', w)
Varietal.find_or_create_by_name_and_grape_id('Riesling', w)
Varietal.find_or_create_by_name_and_grape_id('Sauvignon Blanc', w)

Странно, когда я смотрю на данные в базе данных, все из Varietals связаны с «красным» Grape.Используя консоль Rails, я выяснил, что если я передам поле id из найденного экземпляра Grape, а не сам экземпляр, я получу правильное поведение.

Я что-то упустил?Я думал, что в Rails вы всегда можете передать объект ActiveRecord вместо необработанного идентификатора, и он автоматически найдет значение поля id.

Ответы [ 2 ]

0 голосов
/ 04 января 2012

r и w должны возвращать Grape объектов, верно?Так вы не можете получить доступ к их id таким элементам?

# save grape stuff by entering the ID instead of the object
# create some reds
r = Grape.find_or_create_by_name('Red')
Varietal.find_or_create_by_name_and_grape_id('Cabernet Franc', r.id)
Varietal.find_or_create_by_name_and_grape_id('Cabernet Sauvignon', r.id)
Varietal.find_or_create_by_name_and_grape_id('Malbec', r.id)

# create some whites
w = Grape.find_or_create_by_name('White')
Varietal.find_or_create_by_name_and_grape_id('Chardonnay', w.id)
Varietal.find_or_create_by_name_and_grape_id('Riesling', w.id)
Varietal.find_or_create_by_name_and_grape_id('Sauvignon Blanc', w.id)

Это передало бы идентификатор выбранного вами винограда и совпадало бы с используемым вами динамическим искателем.

0 голосов
/ 04 января 2012

Вы можете нормально передавать объекты вместо идентификаторов, но это больше касается маршрутизации и ассоциаций.

Вы просите его найти по name и grape_id , но передавая имя и виноград экземпляр , в котором и заключается проблема.

Если вы указываете идентификатор в искателе, вам нужно передать идентификатор.

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