1

と の 2 つのモデルがCustomerありContractorsます。私は簡単なアプリをセットアップしましたactivity。最後に、お互いにフィードバックを残してもらいたいと思います。のデータベース フィールドだけで複雑なことは何もありませんcomment

ここで使用する適切なモデルの関連付けは何ですか?

私はこれを試しました

class Customer 
  has_many :feedbacks
end

class Contractor
  has_many :feedbacks
end

class Feedback
  belongs_to :customer
  belongs_to :contractor
end

しかし、ここでの問題は、誰が誰にコメントしたかを特定することです。

たとえば、私がそうするなら

customer = Customer.find(1)
contractor = Contractor.find(1)
customer.feedbacks.create(:comment => "Contractor 1 sucks", :contractor_id => 1)

問題は、contractor.feedbacksと の両方からアクセスできることcustomer.feedbacksです。そして、誰が誰にコメントしたかはわかりません。

任意のガイダンスをいただければ幸いです。何か不足していますか?

ありがとう

4

1 に答える 1

3

これを行う方法は、ポリモーフィック アソシエーションを使用することです。

このようにして、あなたはcommenter関係を築くことができますcommentable

そのようです:

class Customer 
  has_many :feedbacks, as: commenter
  has_many :feedbacks, as: commentable
end

class Contractor
  has_many :feedbacks, as: commenter
  has_many :feedbacks, as: commentable
end

class Feedback
  belongs_to :commenter, polymorphic: true
  belongs_to :commentable, polymorphic: true
end

ここで、Feedback4 つの新しい列が必要になります。

  • commentable_type:string
  • commentable_id:integer
  • commenter_type:string
  • commenter_id:integer

4 つすべてにインデックスを付ける必要があるため、移行を適切に記述してください。type列には、関連付けられたモデル名 (「Customer」または「Contractor」) の文字列値が格納されます。

したがって、次のようなことができます。

  @feedback = Feedback.find 3
  @feedback.commenter
    => # Some Customer

  @feedback.commentable
    => # Some Contractor

そしてその逆。次のように構築します。

@customer = Customer.find 1
@contractor = Contractor.find 1
@feedback = Feedback.new comment: "This is a great Contractor"
@feedback.commenter = @customer  # You can reverse this for a contractor giving feedback to a customer
@feedback.commentable = @contractor
@feedback.save!
于 2013-05-25T18:33:13.913 に答える