0

我想我必须为我的 Rails 应用程序建立一个自引用关联(好吧,在阅读评论后,我猜它不是自引用的,但命名问题仍然存在),但我不知道应该如何设置它起来(即使在观看了有关该概念的 Railscast 之后)。在我的应用中,一个用户可以写另一个用户的评论。因此,用户 has_many :reviews 意味着他们写了很多评论。我已经在下面编码了......

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 :review 用于进行评论的用户,我将如何为正在审查的用户添加关联?另外,我会在迁移中添加什么以包含要审核的用户的 ID?

4

1 回答 1

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到您的 User 模型中并指定另一个foreign_key. 最难的部分是名字;措辞将是“用户是许多评论的主题”,但“reference_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_reviewsand received_reviews、 orwritten_reviewsreceived_reviews。命名可能很困难,但重要的是要使其合理正确。这是编写可维护软件的重要组成部分。

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

$ rails g model Review author:references subject:references

这会给你author_idsubject_id专栏。

于 2013-04-23T21:02:26.723 回答