Rails Seed путаница - PullRequest
       8

Rails Seed путаница

4 голосов
/ 31 декабря 2010

У меня проблемы с заполнением базы данных с использованием seed.rb, особенно когда речь идет о табличных отношениях.

Вот пример кода:

# seed.rb
user = User.find_or_create_by_login(  
  :login => "myname",  
  :email => "myname@gmail.com",  
  :user_type => "Admin",  
  :password => "admin",  
  :password_confirmation => "admin")

project = Project.find_or_create_by_user_id(
  :user_id => user.id,
  :name => "Test Project")

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


Это самое странное поведение, которое я видел в такой простой вещи. В моем начальном файле у меня создается около восьми таблиц, и некоторые из них имеют глубину 3-4 уровня (то есть проекты пользователя has_many; проекты задачи has_many и т. Д.).

Когда я вызываю пользователя user, как указано выше, и ссылаюсь на user.id несколько раз после этого, он работает только один раз! Я пытался добавить [user.reload] перед созданием каждой новой записи, но безрезультатно. Я не думаю, что это будет иметь смысл для кого-либо, но есть ли здесь какие-либо возможности? Спасибо всем.

Ответы [ 5 ]

5 голосов
/ 31 декабря 2010

Я понял, в чем проблема. Поля, которые не были заполнены, не были явно перечислены в attr_accessible в соответствующих моделях. Указанные поля были сохранены правильно.

Большое спасибо за вашу помощь всем.

3 голосов
/ 31 декабря 2010

Код в порядке и правильный синтаксис для find_or_create. Как уже говорили другие, наиболее вероятной проблемой является то, что пользователь недействителен. Попытка вызвать user.reload приведет к взрыву, если пользователь недействителен, и, таким образом, сделает проблему более очевидной, но ошибка, которую вы получите от нее, будет бесполезной (она будет жаловаться на невозможность найти пользователь без идентификатора).

К сожалению find_or_create не работает как метод взрыва, чтобы вызывать исключения, если оно недопустимо, поэтому, вероятно, лучше всего поднять ошибку и вывести ошибку после попытки создания пользователя:

user = User.find_or_create_by_login(:login => "myname")
raise "User is invalid: #{user.errors.full_messages}" unless user.valid?
0 голосов
/ 31 декабря 2010

Вы уверены, что ваш пользователь сохранен? Я думаю, правильный синтаксис для find_or_create_by_XX это Blog.find_or_create_by_title("Some Blog"). Если вам нужно передать больше данных, сначала вам нужно использовать find_or_initialize, а затем устанавливать другие данные отдельно.

Свободно связанный поток: Rails find_or_create по более чем одному атрибуту?

- редактирование

Передача данных в виде хэша на find_or_create_by_XX также работает. Документы находятся в разделе «Динамические искатели на основе атрибутов» здесь http://apidock.com/rails/v3.0.0/ActiveRecord/Base

0 голосов
/ 31 декабря 2010

попробуйте использовать User.find_or_create вместо User.find_or_create_by_login.Кажется, ваш пользовательский объект не сохранен.Или перед тем, как назначить user.id, выполните user.reload

user = User.find_or_create(  
  :login => "myname",  
  :email => "myname@gmail.com",  
  :user_type => "Admin",  
  :password => "admin",  
  :password_confirmation => "admin")

[user.reload]

project = Project.find_or_create_by_user_id(  :user_id => user.id,
  :name => "Test Project")
0 голосов
/ 31 декабря 2010

Пользователь создан с успехом? если так .. попробуйте user.reload, если нет. это, вероятно, ошибка

...