rails has_many通过独立的通过表

时间:2010-09-24 21:06:31

标签: ruby-on-rails has-and-belongs-to-many

我有用户模型,人员模型和公司模型。

用户通过Person有许多公司,反之亦然。

但我希望能够填充与以后可以捆绑的用户无关的人员和公司。

class User < ActiveRecord::Base
  attr_accessible :name
  has_many :people
  has_many :companies, :through => :people
end

class Person < ActiveRecord::Base
  attr_accessible :user_id, :company_id
  belongs_to :users
  belongs_to :companies
end

class Company < ActiveRecord::Base
  attr_accessible :name
  has_many :people
  has_many :users, :through => :person
end

现在在控制台中我想做以下

User.find(1).companies

然后它应该找到我用户(1)是感兴趣的人的公司。

我有错吗,我应该做一些小改动。

2 个答案:

答案 0 :(得分:1)

您的个人模型不能直接“归属”多个,您的belongs_to :usersbelongs_to :companies关联将无法正常工作。公司对人需要通过另一个描述他们之间关系的联接表进行连接,例如就业,它指向每个模型的一个实例:

class Person < ActiveRecord::Base
  has_many :employments
  has_many :companies, :through => :employments
end

class Employment < ActiveRecord::Base
  belongs_to :person
  belongs_to :company
end

class Company < ActiveRecord::Base
  has_many :employments
  has_many :people, :through => :employments
end

然后,您可以使用:through选项将该雇佣关系中另一方的许多公司/人员关联起来。

同样,如果一个Person可以由多个用户拥有,那么你也需要这两个实体之间的连接模型。

答案 1 :(得分:0)

正如后续行动一样,在has_many :through关系中,没有任何内容表明您无法独立使用您的联接表(在您的情况下,)。根据关系的性质,您将通过一个完全独立的ActiveRecord模型加入,这最明显地区别于has_and_belongs_to_many关系。

布拉德在评论中指出,你需要在你们的关系中将“人”复数化为“人”。除此之外,看起来你正确设置它。使用:user_id公开:company_idattr_accessible可以让您稍后从回发中批量分配这些值,但通常您希望避免使用基于角色的关联,如您可能不希望让他们暴露于潜在的HTTP Post攻击。

请记住,在您的控制器中,您可以使用或不使用attr_accessible来执行此类操作:

@person = Person.new
@person.user = User.find(...)
@person.company = Company.find(...)
@person.save

希望有所帮助。