2012-01-11 15 views
0

スルーは、単純化した上でこのにhas_many:元として質問を更新しましたRailsの3.1.1


私の問題を強調あなたの助けのためのアーロン・マクラウド別名AGMCLEODのおかげだったことはないようなものであることを私がすることはできませんそれを働かせるが、私が望むように働かせる。

問題

3機種、会社、支店や連絡先を想像し、それらがCompanyContactsモデルまたはルックアップテーブルを介して相互にリンクされています。これは使用可能であるどのように質問を、

update company_contacts set contact_id = x where branch_id = y AND company_id = z 

テーブルcompany_contactsは次のようになります。

+------------+-----------+------------+ 
| company_id | branch_id | contact_id | 
+------------+-----------+------------+ 

と支店と会社に連絡先を関連付けるための私の理想のステートメントはする必要がありますActiveRecord?あなたは一度にそれを設定するカスタムメソッドを作成しますか?私のモデルでは、私が持っているもの

CompanyContactモデル

belongs_to :company, :class_name => "Company", :foreign_key => :company_id 
belongs_to :branch, :class_name => "Branch", :foreign_key => :branch_id 
belongs_to :contact, :class_name => "Contact", :foreign_key => :contact_id 

会社のモデル

has_many :company_contacts 
has_many :branches, :through => :company_contacts, :source => :branches 
has_many :contacts, :through => :company_contacts, :source => :contacts 

支店モデル

has_many :company_contacts 
has_many :companies, :through => :company_contacts, :source => :companies 
has_many :contacts, :through => :company_contacts, :source => :contacts 

私は次のことを行うことができるのが大好きだが、それは私が

def branch 
    Branch.companies.first 
end 

接触モデル

has_many :company_contacts 
has_many :branches, :through => :company_contacts, :source => :branches 
has_many :companies, :through => :company_contacts, :source => :companies 
ことによってそれをシミュレートすることができもちろん

has_one :company, :through => :company_contacts, :source => :company 

ことはできません

もう一度やりたいことは、has_一方の分岐とhas_oneの会社

私の現在のソリューション何実際に私が達成したいことはある場合には、連絡先を作成し、

+------------+-----------+------------+ 
| company_id | branch_id | contact_id | 
+------------+-----------+------------+ 
| 1   | 1   | nil  | 
+------------+-----------+------------+ 
| nil  | 1   | 1   | 
+------------+-----------+------------+ 

を作成される2つの行の分岐結果に< <とき:

私はこれを行うと考えることができ
+------------+-----------+------------+ 
| company_id | branch_id | contact_id | 
+------------+-----------+------------+ 
| 1   | 1   | 1   | 
+------------+-----------+------------+ 

唯一の方法は、カスタムメソッド

を作成している私は私を試してみて、解決していきますあなたの返信を楽しみにしています

ありがとうございます。

答えて

1

私は質問を投稿したあと、もっと掘り下げた後、私はこの素晴らしい答えに似たものを見つけました。 zeteticは非常に詳細な答えを提供しました。私はこの問題を解決する方法についてもう少し詳しく説明しました。

まずインスピレーション:今has_many :through multiple has_one relationships?

答え:あなたのContactControllerで作成する方法で

コードの魔法の1行は、次のとおりです。ContactControllerさんでいっぱいでとても

@contact.company_contacts.build(:company_id => @company.id, :branch_id => @branch.id) 

作成方法:

# fetch the branch and company ids first 

@contact = Contact.new(params[:contact]) 
@contact.company_contacts.build(:company_id => @company.id, :branch_id => @branch.id) 
@contact.save 

そしてそれは私が達成したいかを正確に行います。

INSERT INTO "company_contacts" ("branch_id", "company_id", "contact_id") VALUES (?, ?, ?) [["branch_id", 2], ["company_id", 4], ["contact_id", 12]] 

ふう - 何らかの理由で私にしばらく時間がかかったし、それを見てとても簡単ですね!

0

これを解決するには、次のようなことができます。ブランチIDと会社IDをフォームに渡していると仮定します。

def create 
    @contact = Contact.new(params[:contact]) 
    if @contact.save 
    cc = CompanyContact.new(:contact_id => @contact.id, :branch_id => params[:branch_id], :company_id => params[:company_id]) 
    cc.save 
    redirect_to contacts_url, :notice => "Contact saved" 
    else 
    render :action => "new" 
    end 
end 

パラメータ名などを調整する必要があるかもしれませんが、動作するはずです。これは3ウェイ接続のビットなので、私は連絡先オブジェクトの上にそれを構築する方法があるかどうかはわかりません。

+0

は実際にあなたに完全に同意しますが、実際にはモデルは異なります。たとえば、会社、支店、連絡先のように言えば、私は明らかに問題を簡略化しているので、これを使用すると良い例になると思います。私がこれをやっている理由は、効率とより少ないクエリのためです。 – Spasm

+0

ああ大丈夫、それはもっと意味がある。あなたはまだあなたが使用しているコードをコントローラに投稿できますか?私はかなり視覚的な人で、助けになるかもしれません。私はどのようにそれが行われると思うだろうと私の答えを調整します。 – agmcleod

関連する問題