显示关联对象

时间:2009-06-22 18:53:26

标签: ruby-on-rails associations

我是Ruby on Rails的新手,并且在关联对象的情况下对视图逻辑有疑问:

我的模型与

类似
class Post < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :post
end

我想要显示的内容类似于所有帖子的列表以及每个帖子的前三个评论。

所以,我保持post contoller index action简单

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

现在在views/posts/index.html.erb我可以做这样的事情 @posts.comments 我可以循环前三个条目。但是,如何在视图(或控制器)中访问通常在模型中完成的功能(在本例中为关联模型),如排序,作用域等?

2 个答案:

答案 0 :(得分: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)

您可以在指定限制的关联上使用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 | ...

希望有所帮助。