首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >双轨模型的反馈模型

双轨模型的反馈模型
EN

Stack Overflow用户
提问于 2013-05-26 02:19:20
回答 1查看 277关注 0票数 1

我有两个型号-- CustomerContractors。我已经设置了一个简单的应用程序,他们在activity上互动。现在,在它的结尾,我想让他们相互反馈。没什么复杂的,只有一个comment的数据库字段。

我想知道在这里应该有什么样的模型关联?

我试过了

代码语言:javascript
复制
class Customer 
  has_many :feedbacks
end

class Contractor
  has_many :feedbacks
end

class Feedback
  belongs_to :customer
  belongs_to :contractor
end

但这里的问题是找出谁评论了谁。

例如,如果我这样做了

代码语言:javascript
复制
customer = Customer.find(1)
contractor = Contractor.find(1)
customer.feedbacks.create(:comment => "Contractor 1 sucks", :contractor_id => 1)

问题是,contractor.feedbackscustomer.feedbacks都可以访问它。我不知道现在是谁在评论谁。

任何指导都是值得感谢的。我是不是遗漏了什么?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-26 02:33:14

实现这一点的方法是使用polymorphic associations

这样,您就可以拥有一个commenter关系和一个commentable关系。

如下所示:

代码语言:javascript
复制
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列将存储相关模型名称的字符串值("Customer“或"Contractor")。

所以你可以这样做:

代码语言:javascript
复制
  @feedback = Feedback.find 3
  @feedback.commenter
    => # Some Customer

  @feedback.commentable
    => # Some Contractor

反之亦然。您将构建如下所示:

代码语言:javascript
复制
@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!
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16752605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档