次の基本的なフォーラムの例を見てください。
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
これがどのように正しく機能するかを理解していますか、何が間違っていますか?