rails has_many通过与独立通过表

问题描述:

我有一个用户模型,人员模型和公司模型。rails has_many通过与独立通过表

a用户有很多公司通过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)是感兴趣的人的公司。

我弄错了吗,我应该做些小小的改变。

+0

首先,对于用户,您有“:through =>:people”,对于公司有“:through =>:person”。这可能会让你的控制台命令起作用,解决这个问题。 – Brad 2010-09-24 21:29:11

您的人模型不能直接“belongs_to”多于一个,您的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选项关联中间那个雇佣关系另一边的许多公司/人。

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

+0

人应该是我的连接表,有点让它搞砸了 – 2010-09-25 07:24:35

+0

安德鲁,你不妨考虑修改你的话,因为你当然可以“属于多于一个”。事实上,你正在以你自己的例子(在就业)中这样做。另外,由于Rails因其对事物的“自动化”方法而臭名昭着,您可能还会考虑声明就业表是一个可以使用的例子(而您的声明目前暗示它“需要”是就业)。再次感谢您的贡献,但只想抛出一些家政物品,特别是对于“Rails/Ruby Newbies” – dooleyo 2013-07-01 15:41:53

+0

@dooleyo更新,感谢您的反馈意见 – 2013-07-03 01:06:10

就像后续,在has_many :through关系中,没有什么说你不能独立使用你的连接表(在你的情况下,Person)。根据关系的性质,您将通过完全独立的ActiveRecord模型加入,这种模式最显着的区别于has_and_belongs_to_many关系。

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

记住,在你的控制器,你可以经常做这样的事情有或无attr_accessible

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

希望有所帮助。