考虑两个模型:
User
=> (id:integer,name:string,created_at:datetime,updated_at:datetime,department_id:integer)Department
=> (id:integer,name:string,created_at:datetime,updated_at:datetime)现在,这两个表之间存在明显的关系。它是
User
都有一个部门Department
属于许多用户,即单个部门中有多个用户所以,我选择epress和A belongs_to B
class User < ActiveRecord::Base
has_one :department
end
class Department < ActiveRecord::Base
belongs_to :user
end
但是你可能知道不起作用&amp;抛出以下错误:
> @user = User.find(1)
> @user.department.name
Department Load (1.0ms) SELECT "departments".* FROM "departments" WHERE "departments"."user_id" = 1 LIMIT 1
ActiveRecord::StatementInvalid: PG::Error: ERROR: column departments.user_id does not exist
经过大量的热播&amp;审判。我偶然发现了正确的方法来定义这个,这是另一种方式,即B belongs to A
class Department < ActiveRecord::Base
has_many :users
end
class User < ActiveRecord::Base
belongs_to :department
end
> @user = User.find(1)
> @user.department.name
Department Load (1.0ms) SELECT "departments".* FROM "departments" WHERE "departments"."id" = 1 LIMIT 1
=> "HR"
现在,这与我的大脑对这些关联的思考方式完全相反。所以,我有点困惑,所以如果有人能解释发生了什么?
为什么B belongs to A
&amp;不是A belongs to B
?
答案 0 :(得分:2)
你的模特错了。它们应该是这样的:
class User < ActiveRecord::Base
belongs_to :department
end
class Department < ActiveRecord::Base
has_many :users
end
因此,要向用户添加部门,您可以执行以下操作:
@user.department.create(:name => 'Science Department')
要将用户添加到部门,您可以执行以下操作:
@department.users.create(:name => 'John')
答案 1 :(得分:1)
第一眼看:has_one
关系有点奇怪。考虑一个用户和一个帐户,每个帐户只与一个用户连接(属于),另一方面是用户has_one帐户,只有一个帐户。帐户是用户拥有的东西。
在这些情况下,您使用has_one
模型上的User
关系,Rails将在user_id
表格中搜索accounts
列(请参阅has_one documentation在Rails指南中。)
在您的具体案例中,我认为完全正确的说“部门有很多用户”和“用户属于部门”。
答案 2 :(得分:-1)
在第一个示例中,您需要添加列&amp;迁移文件中表的索引
class AddRelationToDeparments < ActiveRecord::Migration
def change
add_column, :deparments, :user_id, :integer
add_index, :deparments: :user_id
end
end