2

私は Ruby on Rails の初心者で、関連付けられたオブジェクトの場合のビュー ロジックについて質問がありました。

私のモデルは似ています

class Post < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :post
end

表示したいのは、すべての投稿とそれぞれの最初の 3 つのコメントのリストのようなものです。

そのため、コントローラーのインデックス後のアクションをシンプルに保ちました

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

これで 、最初の 3 つのエントリをループできるviews/posts/index.html.erbようになりました。@posts.commentsしかし、ビュー (またはコントローラー) での順序付け、スコープ設定など、モデル (この場合は関連付けられたモデル) で通常実行される機能にアクセスするにはどうすればよいでしょうか?

4

2 に答える 2

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

必要に応じて、カスタムの関係を定義することもできます (これは非常に複雑な関係用です)。

于 2009-06-22T19:04:00.297 に答える
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 |コメント| ...

それが役立つことを願っています。

于 2009-06-22T19:05:54.927 に答える