質問
私は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 | ...
役立つこと。
所属していません StackOverflow