0

考虑两个模型:

  1. User=>(id:整数,名称:字符串,created_at:日期时间,updated_at:日期时间,department_id:整数)
  2. Department=>(id:整数,名称:字符串,created_at:日期时间,updated_at:日期时间)

现在,这两个表之间有明显的关系。这是

  • 每个User部门都有一个部门
  • ADepartment属于多个用户,即一个部门有多个用户

所以,我选择了与以下相同的epressA belongs_to B

class User < ActiveRecord::Base
  has_one :department
end
class Department < ActiveRecord::Base
  belongs_to :user
end

但您可能知道这不起作用并引发以下错误:

> @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

经过大量的打击和试验。我偶然发现了定义这个的正确方法,这只是另一种方式,即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& NOT A belongs to B

4

3 回答 3

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')
于 2012-05-27T02:02:01.833 回答
1

乍一看,这种:has_one关系有点奇怪。考虑一个用户和一个帐户,每个帐户都连接到(属于)一个用户,从另一端用户 has_one 帐户,只有一个,他的帐户。帐户是用户拥有的东西。

在这些情况下,您has_one在模型上使用关系User,Rails 将在表中搜索user_idaccounts(请参阅 Rails 指南中的has_one 文档)。

在您的具体情况下,我认为说“一个部门有很多用户”和“一个用户属于一个部门”是完全正确的。

于 2012-05-26T23:57:07.687 回答
-1

在第一个示例中,您需要将列和索引添加到迁移文件中的表中

class AddRelationToDeparments < ActiveRecord::Migration
  def change
    add_column, :deparments, :user_id, :integer
    add_index, :deparments: :user_id
  end
end
于 2012-05-26T23:46:13.237 回答