我有用户模型,人员模型和公司模型。
用户通过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 :(得分:1)
您的个人模型不能直接“归属”多个,您的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
选项将该雇佣关系中另一方的许多公司/人员关联起来。
同样,如果一个Person可以由多个用户拥有,那么你也需要这两个实体之间的连接模型。
答案 1 :(得分:0)
正如后续行动一样,在has_many :through
关系中,没有任何内容表明您无法独立使用您的联接表(在您的情况下,人)。根据关系的性质,您将通过一个完全独立的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
希望有所帮助。