我有一个rails应用程序,用户在其中有孩子。所以我有两个模型::用户和:儿童。
我曾经有一个一对多关系(has_many/belongs_to),但我想把它开放给一个多对多关系,在那里我可以存储关于关系的变量。因此,我将这种关系改为"has_many through"关系。我创建了一个名为:relationships的表。一个小警告:我希望用户的foreign_key为:parent_id。以下是我如何设置它们:
架构:
create_table "relationships", :force => true do |t|
t.integer "child_id"
t.integer "parent_id"
t.datetime "created_at"
.
.
.
create_table "users", :force => true do |t|
t.string "email", :null => false
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
t.string "first_name"
t.string "last_name"
.
.
.
create_table "children", :force => true do |t|
t.string "name", :null => false
t.integer "parent_id", :null => false
t.datetime "created_at", :null => false
.
.
.
类别定义:
user.rb:
has_many :relationships, foreign_key: "parent_id"
has_many :children, :through => :relationships, foreign_key: "parent_id"
child.rb:
has_many :relationships, foreign_key: "child_id"
has_many :parents, :through => :relationships
relationship.rb:
belongs_to :parent, class_name: "User", :foreign_key => :parent_id
belongs_to :child, class_name: "Child", :foreign_key => :child_id
现在,当我选择一个特定的用户并尝试获取user.children时,我会得到[]的响应。如果我尝试添加新的子项,也不起作用。我可以定义父项和子项,但当它试图保存时,它无法将两者关联起来。它看不到父对象,所以我得到错误:
*ActiveRecord::StatementInvalid(PG::错误:错误:列"parent_id"中的null值违反非null约束*
如果我将类定义切换回一对多设置,它可以很好地访问子级。我不明白问题出在哪里。如果有任何帮助,我们将不胜感激。
感谢
您是如何建立关系的?当我创建如下关系时,@user.children
适用于给定的示例:
@user.relationships.build(child_id: ...)
parent_id
中的为null。
更改
create_table "children", :force => true do |t|
t.string "name", :null => false
t.integer "parent_id", :null => false
t.datetime "created_at", :null => false
end
至
create_table "children", :force => true do |t|
t.string "name", :null => false
t.integer "parent_id"
t.datetime "created_at", :null => false
end