1

投稿はユーザーに属し、ユーザーは多くの投稿を持っています。
投稿もトピックに属し、トピックには多くの投稿があります。

class User < ActiveRecord::Base
  has_many :posts
end

class Topic < ActiveRecord::Base
  has_many :posts
end

class Post < ActiveRecord::Base
   belongs_to :user
   belongs_to :topic
end

これは非常にシンプルで設定が非常に簡単ですが、トピックを表示するときは、そのトピックのすべての投稿だけでなく、その投稿を作成したユーザーのuser_nameとuser_photoも必要です。ただし、これらの属性はユーザーモデルに保存され、トピックに関連付けられていません。では、どうすればそれを設定できますか?

Postモデルにはユーザー用とトピック用の2つの外部キーがあるので、おそらくすでに呼び出すことができますか?

または、おそらくこれは、関連付けによるある種の「一方向」のhas_manyです。Postが結合モデルであり、トピックがhas_many:users、:through =>:postsであるように。しかし、これの逆は真実ではありません。ユーザーのようにhas_many:topicsはありません。

それで、これはhas_many:thoughアソシエーションである必要さえありますか?コントローラーが特定のトピックに対して投稿とその投稿のユーザーの両方を呼び出すように見えるかについて、私は少し混乱していると思います。

編集:真剣に、すべてのことを検討してくれてありがとう。私はコントローラーに彼のコードを使用したので、talの答えを選びました。ただし、代わりにj。またはtimを簡単に選択することもできます。両方ともありがとう。これは非常に簡単に実装できました。今日はレールとの恋愛の始まりかもしれないと思います。

4

3 に答える 3

3

トピックとその投稿を表示するときにuser_nameとを取得できます...user_photo

何かのようなもの:

@topic.posts.each do |post|
   user_name = post.user.name
   user_photo = post.user.photo
end

簡単だ。あなたの質問がよくわからなかったらごめんなさい。

于 2010-03-30T19:12:34.017 に答える
2

たとえば、投稿の作成者のユーザー名を表示したい場合は、次のようにすることができます(テストされていませんが、機能するはずです):

@posts = topic.posts.all(:include => :user) 

すべての投稿に対して1つのリクエストを生成し、ユーザーに対して1つのリクエストを生成する必要があり、投稿コレクションにはユーザーが含まれている必要があります。

ビューで(ここではhaml):

- @posts.each do |post|
  = post.user.name
  = post.body
于 2010-03-30T19:13:59.847 に答える
2

私があなたの質問を正しく理解していれば、いいえ、has_many:throughアソシエーションはここでは必要ありません。

トピックに投稿したすべてのユーザーのリストを表示したい場合(投稿情報をスキップしたい場合)、それは役に立ちます。

ただし、n + 1クエリを防ぐために、投稿からユーザーを熱心にロードすることをお勧めします。

于 2010-03-30T19:15:26.163 に答える