0

次の基本的なフォーラムの例を見てください。

class Forum < ActiveRecord::Base
  has_many :topics, :dependent => :destroy
end

class Topic < ActiveRecord::Base
  belongs_to :forum
  belongs_to :user
  has_many   :posts, :dependent => :destroy
end

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

class User < ActiveRecord::Base
  has_many :posts
  has_many :topics
end

ここで、各フォーラムの「最後の投稿」情報を取得する機能を追加したいとします。私のフォーラムテーブルには、そのフォーラムで行われた最後の投稿のIDを保持する「last_post_id」という列があります。アクティブレコードがどのように機能するかを理解している場合は、フォーラムモデルに「has_one」関係を追加し、使用する主キーを次のように指定する必要があります。

クラスフォーラム<ActiveRecord::Base has_many:topics、:dependent =>:destroy has_one:last_post、:class_name =>'Post'、:primary_key =>:last_post_id end

次に、私のクエリは次のようになります。

@forums = Forum.all(:include => [:last_post])

これは今のところ正しいですか?ただし、最後の投稿を投稿したユーザー情報も取得したいとします。私の投稿テーブルには、使用できる「user_id」列があります。last_postで行ったように、「has_one」関係を作成する必要がありますか?これは機能していないようです:

class Forum < ActiveRecord::Base
  has_many :topics, :dependent => :destroy
  has_one :last_post  , :class_name => 'Post', :primary_key => :last_post_id 
  has_one :last_poster, :class_name => 'User', :primary_key => :last_post_user_id
end

last_post.user_idの値を使用して、ユーザーテーブルからユーザー情報を取得するにはどうすればよいですか。生のクエリは次のようになります。

SELECT forums.*, 
       last_post.id              as last_post_id,
       last_post.user_id         as last_post_user_id,
       last_post_user.username   as last_post_username,
  FROM forums as forums
 INNER JOIN posts  as last_post      ON last_post.id       = forums.last_post_id
 INNER JOIN users  as last_post_user ON last_post.user_id  = last_post_user.id

last_post.user_idを使用してユーザー情報を取得していることに注意してください。レールを使ってどうやってそれをしますか?目標は、ビューの最後の投稿情報をレンダリングするために次の変数を使用できるようにすることです。

forum.last_post.date       # the last post object
forum.last_poster.username # the user object who created the last post 

これがどのように正しく機能するかを理解していますか、何が間違っていますか?

4

1 に答える 1

2

フォーラムモデルのlast_posterが必要だと思います。ビューでその情報を呼び出したときに、1つしかないので、それを怠惰にロードさせる可能性があります。

したがって、ビューで作業しているときは、forum.last_post.user.usernameを実行してください。

于 2012-08-29T23:07:39.920 に答える