4

我在使用 播种我的数据库时遇到问题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 为空。我怎样才能让它工作?


这是我在如此简单的事情中看到的最奇怪的行为。在我的种子文件中,我创建了大约 8 个表,其中一些嵌套了 3-4 层(即用户 has_many 项目;项目 has_many 任务等)。

user当我如上所述调用用户并user.id在此之后多次引用时,它只能工作一次!我尝试在创建每条新记录之前添加 [user.reload] 但无济于事。我不认为这对任何人都有意义,但是这里有什么可能性吗?谢谢大家。

4

5 回答 5

5

我弄清楚了问题所在。未填充的字段未attr_accessible在其各自的模型中明确列出。列出的字段已正确保存。

非常感谢大家的帮助。

于 2010-12-31T14:21:01.277 回答
3

代码很好,是find_or_create. 正如其他人所说,最可能的问题是用户无效。如果用户无效,尝试调用user.reload会使其崩溃,因此会使问题更加明显,但是您从中得到的错误将是无用的(它会抱怨找不到没有用户身份证)。

不幸的是find_or_create,如果它无效,它不能作为引发异常的 bang 方法,所以最好的办法可能是在尝试创建用户后引发错误并输出错误:

user = User.find_or_create_by_login(:login => "myname")
raise "User is invalid: #{user.errors.full_messages}" unless user.valid?
于 2010-12-31T14:19:30.767 回答
0

成功创建用户?如果是这样..尝试 user.reload 如果不是。这可能是错误

于 2010-12-31T13:40:47.773 回答
0

您确定您的用户已保存吗?我认为正确的语法find_or_create_by_XXBlog.find_or_create_by_title("Some Blog"). 如果您需要传递更多数据,您需要先使用find_or_initialize,然后单独设置其他数据。

松散相关的线程:Rails find_or_create by more than one attribute?

- 编辑

将数据作为散列传递给find_or_create_by_XX似乎也可以。文档位于“基于动态属性的查找器”下http://apidock.com/rails/v3.0.0/ActiveRecord/Base

于 2010-12-31T13:42:39.103 回答
0

试试这个用法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")
于 2010-12-31T13:44:34.983 回答