与接受嵌套属性有许多直通关系

Has Many Through relationship with accepts nested attributes

我知道为了使用嵌套属性我需要使用 has many through 关系而不是 has and belong to many 所以我有以下设置:

class Deed < ActiveRecord::Base
    has_many :deeds_title_abstracts
    has_many :title_abstracts, through: :deeds_title_abstracts
end

class TitleAbstract < ActiveRecord::Base
    has_many :deeds_title_abstracts
    has_many :deeds, through: :deeds_title_abstracts
    accepts_nested_attributes_for :deeds
end

class DeedsTitleAbstracts < ActiveRecord::Base
  belongs_to :deeds
  belongs_to :title_abstracts
end

在我的标题摘要控制器中

def new
   @title_abstract = TitleAbstract.new(params[:title_abstract])
   @title_abstract.deeds.build
   respond_with(@title_abstract)
end

我在视图中使用了 cocoon,但我认为这不是问题所在,因为我收到此错误:

  uninitialized constant TitleAbstract::DeedsTitleAbstract

当我通过控制台查看它时得到以下信息

   @title_abstract =TitleAbstract.new(params[:title_abstract])
   => #<TitleAbstract id: nil, name: nil, due_date: nil, comments: nil,     created_at: nil, updated_at: nil>
   >> @title_abstract.deeds.build
   !! #<NameError: uninitialized constant TitleAbstract::DeedsTitleAbstract>

我认为我的 Has Many Through 模型有问题

您的连接模型名称不符合 Rails 命名约定。它应该被称为 DeedTitleAbstract 而不是 DeedsTitleAbstracts。因此,修复此 class 名称(包括数据库 table 名称)可能是最好的做法,而不是合并解决方法(如下所示)。

解决方法是向 has_many :deeds_title_abstracts 提供 class_name 选项,如下所示:

has_many :deeds_title_abstracts, class_name: 'DeedsTitleAbstract'

参见:Naming Conventions

此外,您的 belongs_to 关系定义需要审核。 belongs_to 关系应该在包含外键的模型上定义,它们应该是单数而不是复数。

这是对您的关系定义的更新(即当然是在您更新加入 table 迁移包括模型名称更改之后)

class Deed < ActiveRecord::Base
    has_many :deed_title_abstracts
    has_many :title_abstracts, through: :deed_title_abstracts
end

class TitleAbstract < ActiveRecord::Base
    has_many :deed_title_abstracts
    has_many :deeds, through: :deed_title_abstracts
    accepts_nested_attributes_for :deeds
end

class DeedTitleAbstract < ActiveRecord::Base
  belongs_to :deed
  belongs_to :title_abstract
end