1

我有两个模型 -CustomerContractors. 我设置了一个简单的应用程序,它们在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

现在,Feedback将需要四个新列:

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

所有四个都应该被索引,所以适当地编写你的迁移。这些type列将存储相关模型名称的字符串值(“客户”或“承包商”)。

因此,您可以执行以下操作:

  @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 回答