1

created_by 列と modified_by 列を持つ複数のモデルがあります。これは私がディールモデルのために持っているものです。

class Deal
  has_one :user , :foreign_key => 'created_by'
  has_one :user , :foreign_key => 'modified_by'
end

class User
  belongs_to :created_by , :class_name => 'Deal' , :foreign_key => 'created_by'
  belongs_to :modified_by , :class_name => 'Deal' , :foreign_key => 'modified_by'
end

ディールを作成すると、正しく保存されているように見えます。しかし、ショービューで取得しようとすると@deal.created_by.email、「未定義のメソッドemail」エラーが発生します。これを機能させる方法を教えてください。

また、これらの 2 つの列を持つ複数のモデルがあるため、User モデルには多くの belongs_to が存在する可能性があります。この場合のエレガントな解決策はありますか?

4

2 に答える 2

4

最初に追加する必要があるのは、アクセス可能な属性の仕様です。ユーザーに次を追加する必要があります。

attr_accessible :email, :created_by, :modified_by

取引中:

attr_accessible :created_by, :modified_by

しかし、関係の方向性も変える必要があります。foreign_key は常に belongs_to 側にあります。

これは私のために働いたものです:

class Deal < ActiveRecord::Base
  belongs_to  :created_by, :class_name => "User", :foreign_key => "created_by"
  belongs_to  :modified_by, :class_name => "User", :foreign_key =>"modified_by"

  attr_accessible :created_by, :modified_by, :name
end

class User < ActiveRecord::Base
  has_many :created_deals, :class_name => "Deal", :foreign_key => "created_by"
  has_many :modified_deals, :class_name => "Deal", :foreign_key => "modified_by"

  attr_accessible :created_deals, :modified_deals, :name
end

似たようなモデルが他にもある場合は、おそらくポリモーフィックな関連付けを使用できます: http://guides.rubyonrails.org/association_basics.html#polymorphic-associations

于 2010-10-10T12:19:06.377 に答える
2

まず第一に、私の経験から、外部キーを名前として使用して関連付けを行うことは一般的に悪い考えです。特にフィクスチャを記述する場合、レールは実際の値「created_by」を設定するか、created_by 関連付けのモデルを設定するかで混乱するようです。私のモデルでは、通常、あなたが説明するケースにこれらの関連付けを使用します。

belongs_to :creator, :class_name => "User", :foreign_key => 'created_by'
belongs_to :modifier, :class_name => "User", :foreign_key => 'modified_by'

必要に応じて、代わりに「creating_user」などの関連付け名を使用できます。関連付け名として created_by が本当に必要な場合は、関連付け名と等しくない限り、created_by_id または外部キーと同様のものを使用する必要があります。

次に、貼り付けたコードに少し混乱しています。あなたの選択「Deal has_one User」と「User belongs_to Deal」は、users テーブルに、Deal Id を含む created_by 列と modified_by 列 (外部キー) があることを意味します。基本的に、ユーザーは単一の取引によって作成されることを意味しますか? ただし、取引はユーザーによって作成されるべきであり、その逆ではないようです。deal.created_by.email の例は、関連付けではまったく機能しません。取引には「created_by」と呼ばれる関連付けがなく、「user」のみであり、そのうちの 1 つのモデルで同じ名前の関連付けが 2 つあるためです。そもそも全然効かない。

パトリックが提案したものと同様に関連付けを修正します。

class Deal < ActiveRecord::Base
  belongs_to  :creator, :class_name => "User", :foreign_key => "created_by"
  belongs_to  :modifier, :class_name => "User", :foreign_key =>"modified_by"
end

class User < ActiveRecord::Base
  has_many :created_deals, :class_name => "Deal", :foreign_key => "created_by"
  has_many :modified_deals, :class_name => "Deal", :foreign_key => "modified_by"
end
于 2011-02-12T19:09:57.460 に答える