سؤال

أنا روبي على القضبان مبتدئ و لدي سؤال حول وجهة نظر المنطق في حالة من الأشياء المرتبطة بها:

نماذج بلدي تبدو مشابهة

class Post < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :post
end

و ما أريد أن العرض هو شيء مثل قائمة من جميع الوظائف و أول ثلاثة تعليقات لكل منها.

لذا ظللت بعد contoller مؤشر العمل بسيطة

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

الآن في views/posts/index.html.erb أستطيع أن أفعل شيئا مثل هذا @posts.comments والتي لا يمكن أن الحلقة الأولى ثلاثة مداخل.ولكن كيف يمكنني الوصول إلى الوظائف التي يتم عادة في نموذج (في هذه الحالة المرتبطة نموذج) مثل طلب تحديد النطاق إلخ.في رأي (أو وحدة تحكم)?

هل كانت مفيدة؟

المحلول

يجب تجنب كتابة الأعمال المعقدة الدخول في الرأي.في هذه الحالة التنفيذ الخاص بك هو بسيط بما فيه الكفاية التي يمكنك كتابة كل كود في وجهة نظركم.ينبغي أن تبدو مثل هذا

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

إذا أنا الحق،.كل يمكن إزالتها.

<% @posts.each do |post| %>
  <% @post.comments.recent do |comment| %>
      do something
  <% end %>
<% end %>

إذا كنت تفضل, يمكنك أيضا تحديد مخصص العلاقة (هذا هو حقا العلاقات المعقدة).

نصائح أخرى

يمكنك استخدام أسلوب بحث على الجمعيات التي حددت الحد مثل:

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

في طريقة العرض الخاصة بك, أو يمكنك إنشاء جمعية أخرى في نموذج آخر شيء من هذا القبيل:

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

ثم يمكنك فقط الإشارة أن جمعية مثل

@بعد.first_three_comments.كل فعل |تعليق| ...

على أمل أن يساعد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top