Отображение связанных объектов - PullRequest
2 голосов
/ 22 июня 2009

Я новичок в 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 который я могу зациклить для первых трех записей. Но как мне получить доступ к функциям, которые обычно выполняются в модели (в данном случае связанной модели), например, упорядочение, определение области и т. Д. В представлении (или контроллере)?

Ответы [ 2 ]

1 голос
/ 22 июня 2009

Вы можете использовать метод поиска для ассоциации, в котором указан предел, например:

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

по вашему мнению, или вы можете создать другую ассоциацию в вашей модели Post, например:

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

и тогда вы можете просто сослаться на эту ассоциацию как

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

Надеюсь, это поможет.

1 голос
/ 22 июня 2009

Вы должны избегать написания сложных бизнес-логин в представлении. В этом случае ваше выполнение достаточно простое, чтобы вы могли написать весь код в своем представлении. Это должно выглядеть так

<% @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 %>

Если вы предпочитаете, вы также можете определить пользовательские отношения (это действительно сложные отношения).

...