2010-09-24 95 views
1

我有一個用戶模型,人員模型和公司模型。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

回答

1

您的人模型不能直接「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

0

就像後續,在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 

希望有所幫助。