2012-08-29 27 views
0

以下面的基本論壇爲例。需要幫助瞭解ActiveRecord的工作原理

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 

現在說我想添加獲取每個論壇的「最新帖子」信息的能力。我的論壇表有一個名爲「last_post_id」的專欄,該專欄包含在論壇中發佈的最後一篇文章的ID。如果我的理解是如何活動記錄的作品,我需要一個「HAS_ONE」的關係添加到我的論壇模型,並指定主鍵我想用,像這樣:

類論壇<的ActiveRecord :: Base的 的has_many:主題,:依賴=>:摧毀 HAS_ONE:LAST_POST,:CLASS_NAME => '帖子',:primary_key =>:last_post_id 結束

然後我的查詢應該是這樣的:

@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獲取用戶信息。你如何使用rails來做到這一點?目標是讓以下變量可用於呈現視圖中的最後發佈信息。

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

我理解這是如何正確工作的,我做錯了什麼?

回答

2

我會說在論壇模式last_poster似乎是必要的。由於只有一個我可能會讓我在視圖中調用該信息時懶惰地加載。

所以,當你在你的視圖工作只是做forum.last_post.user.username

+0

這是非常有益的,謝謝! – Ken