使用外键创建Object.New导致nil?

时间:2014-02-05 13:51:11

标签: ruby-on-rails ruby-on-rails-3

我有两种模式:

class Todo < ActiveRecord::Base
    belongs_to :assigned_to, :class_name => "TeamMembership"
end

class TeamMembership < ActiveRecord::Base
    has_many :assigned_todos, :class_name => 'Todo', :foreign_key => :assigned_to, :dependent => :destroy
end

当我这样做时:

Todo.new(:title=>'hello',:assigned_to=>TeamMembership.first)

(其中TeamMembership.first是数据库中的有效记录),我得到Todo

:title = hello
:assigned_to = nil

为什么:assigned_to为零,我该如何解决?

谢谢!

3 个答案:

答案 0 :(得分:1)

执行此操作的“Rails方式”将是:

class Todo < ActiveRecord::Base
    belongs_to :team_membership
end

class TeamMembership < ActiveRecord::Base
    has_many :todos, depdendent: :destroy
end

t.references :team_membership块中的create_table行,用于创建todos表的迁移。

然后创建一个标题为“hello”且属于第一个Todo的新TeamMembership,你可以这样做:

TeamMembership.first.todos.build(title: "hello")

请参阅http://guides.rubyonrails.org/association_basics.html#has-many-association-reference

可能有某些特定原因要您重命名关联&amp;外键,但你仍然可以在todos集合上使用build方法。

答案 1 :(得分:0)

你添加了任何验证吗?如果是,那么试试控制台Todo.new(:title =&gt;'你好',:assigned_to =&gt; TeamMembership.first,:validate =&gt;'false') 并看到其他明智的结果请告诉我Todo的属性

答案 2 :(得分:0)

好的,事实证明问题是:

  • 需要使用_id作为后缀,creator_id等重命名数据库字段。
  • 然后您需要将ID作为整数放入,而不是传入对象。