2

最初にRails 3.13-1から安定ブランチを更新しました。Rails has_many:throughと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 

だから私は2つの解決策

まずソリューション

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 
考えます

第2の解決策

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

class User 
    belongs_to :job 
end 

どのルートに行ってください。私のコードは正しいのですか?

私は別の質問を持っていますが、class_name => "CompaniesUsers"オプションをhas_manyに渡します。クラスはSingularまたはPluralであるべきですか? 従業員のような名前に変更する必要がありますか?

PS:私は何かが欠けていない限り、私は単にこれはあなたに

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

のような方法を与えるだろう

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

class User 
    has_many :jobs 
end 

を行うことをお勧めしたいRuby on Rails: Talk

+0

1つのジョブをただ1人の雇用者(ユーザ)に所属させますか? – Dogbert

+0

はい、ジョブは1つの雇用者(ユーザー)にのみ属し、ユーザーには多くのジョブが属している必要があります。しかし、仕事を所有しているユーザーは、仕事を投稿した会社の従業員でなければなりません。 – kalbasit

答えて

1

に同じ質問を投稿これが機能するには、ジョブテーブルにemployer_id整数フィールドが必要です。

+0

問題はすでに仕事が会社に属しているので(上記の私のコードを見てください)、私はそれを多形関連にするべきですか?私は:counter_cacheをJobからCompanyへの関連付けで有効にしていますが、これを多態性関連付けでどのように有効にすることができますか? – kalbasit

+0

会社に所属する仕事は問題ではありません。これは 'company_id'に格納されます。 – Dogbert

+0

あなたの会社には多くのユーザーがいて、ユーザーには多くの会社がありますが、その仕事は一人の企業と一人のユーザーに属するべきですか? – Dogbert

0

通常は、モデルを通して、あなたのパスに名前を付けたい:

company_user 

その後あなたがこの必要はありません。

:ちょうどあなたのデータベーステーブルの名前があることを確認してください

class_name: "CompaniesUsers" 

company_users 

あなたの作品はあなたのために優れています。私がコンベンションに従わなかったときに見つけたのは、 道路にトラブルが起きたときです。