2016-05-18 8 views
1

私は私のアプリでこの設定を持っていた:このセットアップuser.product_leadsrails4のActiveRecordの団体

User has_many :products 
User has_many :product_leads, through: :products 
Product belongs_to :user # (in products table there is user_id) 
ProductLead belongs_to :product # (in product_leads table there is no user_id) 
ProductLead belongs_to :user 

は機能していますが、product_lead.userではありません。だから私は最後の行を削除しました。

product_leadsテーブルにはuser_idがありませんが、私はしたくないです。 ProductLeadフォームは、Productフォームと共にネストされた属性として埋められます。

下記よりproduct_lead.userを定義する方が良いでしょうか?または、product_leadsテーブルにuser_idがあるはずですか?

product_lead.rb

def user 
    product.user 
end 

答えて

1

私はhas_one :through協会があなたを助けるだろうと信じています。

def ProductLead < ActiveRecord::Base 
    has_one :product 
    has_one :user, through: :product 
    # ... other code 
end 
+0

これは代わりにするProductLead' 'で' product_id'外部キーを交換する作業が必要となります'products_lead_id'を' products'テーブルに追加しましたが、その障害物を除いて、うまくいくはずです。 –

1

私はあなたがいる限り、それが読み取り専用だあなたはproductuserを割り当てる必要はありませんよう提案してきたアプローチに問題が表示されません。

ただし、場合にはnilに userを呼び出しに対するガードが product存在しないはずです。

def user 
    product.try(:user) # Only call `user` if product is non-nil. 
end 
+0

Anthony、モデルで 'validates:user、presence:true'と' db.integer "user_id"、null:false "の両方をdbで使用します。それでも 'try'を使うことをお勧めしますか? –