スルーは、単純化した上でこのに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 |
+------------+-----------+------------+
唯一の方法は、カスタムメソッド
を作成している私は私を試してみて、解決していきますあなたの返信を楽しみにしています
ありがとうございます。
は実際にあなたに完全に同意しますが、実際にはモデルは異なります。たとえば、会社、支店、連絡先のように言えば、私は明らかに問題を簡略化しているので、これを使用すると良い例になると思います。私がこれをやっている理由は、効率とより少ないクエリのためです。 – Spasm
ああ大丈夫、それはもっと意味がある。あなたはまだあなたが使用しているコードをコントローラに投稿できますか?私はかなり視覚的な人で、助けになるかもしれません。私はどのようにそれが行われると思うだろうと私の答えを調整します。 – agmcleod