質問

私は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

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

役に立ちましたか?

解決

ビューに複雑なビジネスログインを記述しないでください。この場合、実行はシンプルで、ビューにすべてのコードを書くことができます。このように見えるはずです

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

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

他のヒント

次のような制限を指定した関連付けに対してfindメソッドを使用できます。

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

ビューで、または次のような投稿モデルで別の関連付けを作成できます:

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

その後、次のようにその関連付けを参照できます

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

役立つこと。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top