1

まず、コメントは任意のオブジェクト(私の場合は投稿と記事)に属することができるため、ポリモーフィックな関連付けを設定します。

私は言うことができるようにしたい:

u = user.first
u.comments #This will list all comments from a user
u.comments.where(:commentable_type => "Post")  

上記の行は機能しません。SQLを生成します:SELECT"comments"。*FROM "comments"WHERE"comments"。"commentable_id"= 1AND"comments"。"commentable_type"='User'AND"comments"。"commentable_type"='Post'

コメントは2つのタイプに属することができないため、明らかにこれは空のリストを返します。私も言うことができるようにしたいと思います:

f = Food.first
f.comments.first.user #give me the user that posted the first comment

これが私の基本モデルです...これを変更するためのヒントはありますか?

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

class Post < ActiveRecord::Base
  has_many :comments, :as => :commentable
end

class Article < ActiveRecord::Base
  has_many :comments, :as => :commentable
end

class User < ActiveRecord::Base
    has_many :comments, :as => :commentable
end
4

2 に答える 2

4

コメント モデルを確認する必要があると思います。次のようになります。

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

したがって、2 つのリレーションシップがあり、最初のリレーションシップはコメントを投稿したユーザーを指し、もう 1 つのリレーションシップはコメントされているオブジェクトを指します。

Comment.first.user # this will return the user

Comment.first.commentable # this will return the object which the comment was attached (Post, Article or ?Food?)

このアプローチを試してみたい場合は、移行を忘れないでください。

于 2012-09-03T20:11:18.907 に答える
0

目的を達成するには、次のことができる必要があります。

u.comments.map { |cmt| Post.find(cmt.commentable) }

記事についても同様です。これは、投稿または記事の配列を返します。存在しない場合はエラーが発生するため、そのように変更する必要があります。

2番目の質問は完全には理解できません。f.comments.first が 1 つのコメントのみを返す場合、クラス User および Comment が正しく設定されていると仮定すると、.user はそのコメントのユーザーを返す必要があります (Alexandre Abreu が指摘するように、 User has_many comments / Comment belongs_to user を使用)アウト)、しかし多分私はあなたの質問を誤解しています.

于 2012-09-03T20:24:56.347 に答える