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)是感兴趣的人的公司。
我弄错了吗,我应该做些小小的改变。
您的人模型不能直接“belongs_to”多于一个,您的belongs_to :users
和belongs_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
选项关联中间那个雇佣关系另一边的许多公司/人。
同样,如果一个人可以由多个用户拥有,那么您也需要这两个实体之间的连接模型。
人应该是我的连接表,有点让它搞砸了 – 2010-09-25 07:24:35
安德鲁,你不妨考虑修改你的话,因为你当然可以“属于多于一个”。事实上,你正在以你自己的例子(在就业)中这样做。另外,由于Rails因其对事物的“自动化”方法而臭名昭着,您可能还会考虑声明就业表是一个可以使用的例子(而您的声明目前暗示它“需要”是就业)。再次感谢您的贡献,但只想抛出一些家政物品,特别是对于“Rails/Ruby Newbies” – dooleyo 2013-07-01 15:41:53
@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
希望有所帮助。
首先,对于用户,您有“:through =>:people”,对于公司有“:through =>:person”。这可能会让你的控制台命令起作用,解决这个问题。 – Brad 2010-09-24 21:29:11