我明白为了使用嵌套属性我需要使用一个有很多通过关系而不是一个has并且属于很多,所以我有以下设置:
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模型存在问题
答案 0 :(得分:0)
您的连接模型名称不是每个Rails命名约定。它应该被称为DeedTitleAbstract
DeedsTitleAbstracts
。因此,修复此类名称(包括数据库表名称)可能是最好的做法,而不是合并一个变通方法(如下所示)。
解决方法是将class_name
选项提供给has_many :deeds_title_abstracts
:
has_many :deeds_title_abstracts, class_name: 'DeedsTitleAbstract'
请参阅:Naming Conventions。
此外,您的belongs_to
关系定义需要进行审核。 belongs_to
关系应该在包含外键的模型上定义,它们应该是单数而不是复数。
以下是您的关系定义的更新(当然,在您更新了连接表迁移后,包括模型名称更改)
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