2

首先我使用Rails 3.13-1穩定分支更新一小時前。Rails has_many:通過和has_one:通過協會

我開發一個應用程序,我有3個重要的車型用戶公司工作,這裏的模型的相關部分:

class User < ActiveRecord::Base 
    has_many :companies_users, class_name: "CompaniesUsers" 
    has_many :companies, :through => :companies_users, :source => :company 
end 

class Company < ActiveRecord::Base 
    has_many :companies_users, class_name: "CompaniesUsers" 
    has_many :employees, :through => :companies_users, :source => :user 
    has_many :jobs, :dependent => :destroy 
end 

class Job < ActiveRecord::Base 
    belongs_to :company, :counter_cache => true 
end 

class CompaniesUsers < ActiveRecord::Base 
    belongs_to :company 
    belongs_to :user 
end 

代碼工作得很好,但我一直在想,如果有可能:

我想一個工作僱主鏈接,所以認爲這種情況的:用戶約翰誰是在僱員例,他張貼的工作Rails開發者,所以我想訪問@ job.employer,它應該讓我回到用戶約翰,在其他關鍵詞:

@user = User.find_by_name('john') 
@job = Job.find(1) 
@job.employer == @user  #=> true 

於是我想到了兩個可能的解決方案

首先解決

class Job 
    has_one :employer, :through => :employers 
end 

class User 
    has_many :jobs, :through => :employers 
end 

class Employer 
    belongs_to :job 
    belongs_to :user 
end 

第二類解決方案

class Job 
    has_one :employer, :class_name => "User" 
end 

class User 
    belongs_to :job 
end 

我應該去哪條路線?我的代碼是否正確?

我有另一個問題,如何擺脫class_name =>「CompaniesUsers」選項傳遞給has_many,該類應該是單數還是複數?我應該將它重命名爲員工

PS:我貼到Ruby on Rails: Talk

+0

你想讓一個工作只屬於一個僱主(用戶)嗎? – Dogbert

+0

是的,一個工作應該只屬於一個僱主(用戶),並且一個用戶有很多工作。然而,擁有這份工作的用戶必須是公佈的工作公司的僱員。 – kalbasit

回答

1

同樣的問題,除非我失去了一些東西,我會建議簡單地做

class Job 
    belongs_to :employer, :class_name => "User" 
end 

class User 
    has_many :jobs 
end 

這將使你喜歡的方法

user = User.first 
user.jobs.create(params) 
user.jobs # array 
job = user.jobs.first 
job.employer == user # true 

您需要在工作表中使用employer_id整數字段才能正常工作。

+0

問題是一份工作已經屬於一家公司(請參閱我的代碼上面),所以我應該使它多態聯繫對嗎?儘管我在Job和Company之間的關聯中啓用了counter_cache,但我怎樣才能通過多態關聯來啓用它呢? – kalbasit

+0

屬於公司的工作不應該是一個問題。這將存儲在'company_id'中。 – Dogbert

+0

貴公司有很多用戶,用戶有很多公司,但工作應該屬於_one_ company和_one_用戶,對吧? – Dogbert

0

通常你想通過模型來命名通:

company_user 

那麼你不需要這樣的:

class_name: "CompaniesUsers" 

只是讓你的數據庫表中確認的名稱是:

company_users 

你對你有用,所以這很好。我只是發現,當我不遵守約定我 跑到麻煩下路。