与接受嵌套属性有许多直通关系
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'
此外,您的 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
我知道为了使用嵌套属性我需要使用 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'
此外,您的 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