用户has_many:两次评论

时间:2013-04-23 20:55:11

标签: ruby-on-rails

我认为我必须做一个自我引用的关联(好的,在阅读评论之后,我想这不是自我引用,但命名问题仍然存在)对于我的Rails应用程序,但我无法弄清楚我是怎么做的应该设置它(甚至在观看关于概念的Railscast之后)。在我的应用中,用户可以撰写对其他用户的评论。因此,用户has_many:评论他们写了很多评论。我在下面编码了......

User.rb

has_many :reviews  (a user can review many professionals)


Review.rb

belongs_to :user

在我正在进行的迁移中

rails g resource Review user_id:integer review:text

我的问题是,既然我已经说过,User.rb has_many:reviews和Review.rb belongs_to:对进行评论的用户进行审核,我该如何为正在审核的用户添加关联?另外,我将在迁移中添加哪些内容以包含要审核的用户的ID?

1 个答案:

答案 0 :(得分:3)

您的reviews表实际上是一个多对多表,其中两个键都指向users表。

首先,您需要决定关键名称;我建议“作者”和“主题”,因为“评论者”和“评论者”可能会引起混淆。

你这样设置模型:

class User
  has_many :authored_reviews, class_name: "Review", foreign_key: "author_id"


class Review    
  belongs_to :author, class_name: "User"
  belongs_to :subject, class_name: "User"

我认为您遗失的内容是您希望查看用户的评论对象?为此,您需要向用户模型添加另一个has_many并指定另一个foreign_key。最难的部分是名字; verbiage将是“用户是许多评论的主题”,但“referencing_reviews”可能就足够了。我想我可能只是选择“评论”:

class User
  # Reviews this user has written
  has_many :authored_reviews, class_name: "Review"

  # Reviews others have written about this user
  has_many :reviews, class_name: "Review", foreign_key: "subject_id"

另一种策略可能是处理评论,例如消息,并调用您的关联sent_reviewsreceived_reviews,或written_reviewsreceived_reviews。命名可能很困难,但重要的是要使其合理正确。这是编写可维护软件的重要部分。

要为reviews表生成迁移,请使用references而不是integer作为外键,这将为您设置_id后缀和索引:

$ rails g model Review author:references subject:references

这会为您提供author_idsubject_id列。