Rails为同一模型的多态关联和has_many

时间:2016-08-30 09:17:15

标签: ruby-on-rails ruby polymorphic-associations

我有一个Comment模型,它属于其他一些模型,如Post,Page等和has_one(或belongs_to?)用户模型。但是我也需要用户可以评论,所以用户必须有很多来自其他用户的评论(这是多态的:可评论的关联),他必须有自己的评论,由他撰写。 建立像这样的协会的最佳方式是什么?如果用户与评论有两种不同的关联,如何在控制器中读取和创建用户评论? 现在我这样做了,我猜错了:

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
  has_many :comments, as: :commentable
  has_many :comments
end

class Comment < ActiveRecord::Base
    belongs_to :commentable, polymorphic: true
    belongs_to :user
end

class CreateComments < ActiveRecord::Migration
  def change
    create_table :comments do |t|
      t.text :content
      t.references :commentable, polymorphic: true, index: true
      t.belongs_to :user
      t.timestamps null: false
    end
  end
end

1 个答案:

答案 0 :(得分:3)

您需要为该关联使用其他名称。

has_many :comments, as: :commentable
has_many :commented_on, class_name: 'Comment' # you might also need foreign_key: 'from_user_id'.

See has_many's documentation online

在你的情况下不应该foreign_key,但我指出Just In Case™。默认情况下,Rails会猜测“{class_lowercase} _id”(所以在名为User的类中为user_id)。

然后您可以访问这两个关联(明确需要class_name,因为Rails无法从Comment找到commented_on