我已经开始学习rails了,为此我开始开发一个具有嵌套属性的运送应用程序。基本上我有User
和Box
之间的HABTM模型BoxKind
,Box
和Kind
表。
用户模型
class User < ActiveRecord::Base
has_many :boxes
accepts_nested_attributes_for :boxes
end
Box Model
class Box < ActiveRecord::Base
belongs_to :user, :foreign_key => "user_id"
accepts_nested_attributes_for :user
has_and_belongs_to_many :kinds, join_table: :boxes_kinds
accepts_nested_attributes_for :kinds
end
亲切型号
class Kind < ActiveRecord::Base
has_and_belongs_to_many :boxes, join_table: :boxes_kinds
end
当我尝试向数据库添加新记录时,我收到unknown attribute: box_id
错误。这对我来说有点混乱,因此我在名为Box
的{{1}}模型中添加了自定义主键。
我哪里错了?
更新由于@NitinVerma另外请求的是控制台日志:
ref_no
答案 0 :(得分:3)
<强> HABTM 强>
我认为问题是你的habtm
表:
create_table "boxes_kinds", id: false, force: true do |t|
t.integer "ref_no", null: false
t.integer "kind_id", null: false
end
Rails has_and_belongs_to_many
表意味着包含每个关联表的foreign_key
:
您遇到的问题是,由于您的表的box_id
为ref_no
,因此Rails无法确定要保存值的列;因此调用你所看到的例外。
我建议您为association_foreign_key
关联使用foreign_key
或has_and_belongs_to_many
个参数:
#app/models/box.rb
Class Box < ActiveRecord::Base
has_and_belongs_to_many :kinds, foreign_key: "ref_no"
end
#app/models/kind.rb
Class Kind < ActiveRecord::Base
has_and_belongs_to_many :boxes, association_foreign_key: "ref_no"
end
答案 1 :(得分:0)
你必须改变boxes_kinds表。删除ref_no并添加box_id。因为连接表保存了像#{model_name}_id
这样的关联表的id列。您还需要从用户许可参数中删除id列或者说父权限参数。 id列只需要子模型。此外,如果您想在编辑父级时销毁任何关联的子对象,也可以选择添加_destory以允许参数。
def user_box_params
params.require(:user).permit(:name, :email, :address, :postcode, :tel_no, :state,
boxes_attributes: [:id, :ref_no, :quantity, :collected_at, :destination_country, :destination_country_address, :shipped, :shipped_at, :reached, :reached_at, _destroy,
kinds_attributes: [:id, :big, :small, :odd, :trunck, _destroy]])
end