2009-06-22 78 views
2

我是一個Ruby on Rails的新手,在關聯對象的情況下,有一個關於觀點的邏輯問題:顯示關聯對象

我的模型類似於

class Post < ActiveRecord::Base 
    has_many :comments 
end 

class Comment < ActiveRecord::Base 
    belongs_to :post 
end 

而我想顯示爲類似於所有帖子的列表以及每個帖子的前三個評論。

所以,我不停的後位指示索引操作簡單

class PostController < ApplicationController 
    #.. 
    def index 
    @posts = Post.find(:all) 
    end 
    #.. 
end 

現在在views/posts/index.html.erb我可以做這樣的事情@posts.comments 我可以循環的前三項。但是,如何訪問模型(在這種情況下是相關模型)中正常完成的功能,如視圖(或控制器)中的排序,範圍等?

回答

1

您應該避免在視圖中編寫複雜的業務登錄。在這種情況下,您的執行非常簡單,您可以在視圖中編寫所有代碼。它應該看起來像這樣

<% @posts.each do |post| %> 
    <% @post.comments.all(:limit => 3, :order => "created_at DESC").each do |comment| %> 
     do something 
    <% end %> 
<% end %> 

有一些可能的改進。首先,使用named_scope。

class Post < ActiveRecord::Base 
    has_many :comments 
end 

class Comment < ActiveRecord::Base 
    belongs_to :post 
    named_scope :recent, proc { |limit| :limit => limit || 3, :order => "created_at DESC") } 
    # you can also hard-code the limit value (ScottD) 
    named_scope :recent, :limit => 3, :order => "created_at DESC" 
end 


<% @posts.each do |post| %> 
    <% @post.comments.recent.each do |comment| %> 
     do something 
    <% end %> 
<% end %> 

如果我是對的,.each可以被刪除。

<% @posts.each do |post| %> 
    <% @post.comments.recent do |comment| %> 
     do something 
    <% end %> 
<% end %> 

如果您願意,也可以定義一個自定義關係(這對於非常複雜的關係)。

+1

我會對你的例子做一些小的修改: 1)你不需要指定範圍的proc。只是做named_scope:最近:限制=> 3,:訂單... 2)在視圖中,我會使用部分: <%= render:partial「comment」,:collection => @ post.comments.recent% > Rails將發送由named_scope返回的數組,併爲您呈現局部循環。 – scottd 2009-06-22 19:18:27

+0

謝謝ScottD!我更新了這個例子。 – 2009-06-22 19:36:13

1

你可以使用在其指定的類似限制的關聯一個find方法:在你看來

@post.comments.find(:all, :limit => 3) 

,或者您可以在Post模型像創建另一個協會:

has_many :first_three_comments, :limit => 3, :class_name => "Comment" 

然後你可以參考像

@ post.first_three_comments.each do | comment | ...

希望有所幫助。