Поскольку вы, вероятно, захотите организовать комментарии в соответствии с тренировками, которые прокомментировал пользователь (в отличие от одной длинной недифференцированной строки комментариев без какого-либо контекста), сначала я бы предложил использовать: has_many => throughчтобы объединить тренировки, которые прокомментировал пользователь, что-то вроде (непроверено, очевидно):
has_many :commented_workouts, :through => :comments, :class_name => 'Workout', :source => :workout, :uniq => true, :order => "created_at desc"
Тогда вы можете отобразить комментарии в своем эрбе что-то вроде:
<% current_user.commented_workouts.each do |workout| %>
<%= workout.name %>:
<% workout.comments.each do |comment| %>
<%= comment.text %>
<% end %>
<% end %>
РЕДАКТИРОВАТЬ: вы также можете сделать:
<% current_user.commented_workouts.each do |workout| %>
<% workout.comments.sort{|x,y| x.created_at <=> y.created_at }.each do |comment| %>
<%= comment.user.name %> just commented on <%= workout.title %>:
<div><%= comment.text %></div>
<% end %>
<% end %>
РЕДАКТИРОВАТЬ: Или как это так (обратите внимание на ограничение, добавляемое в массив):
class User
def watched_comments
commented_workouts.map(&:comments).flatten.sort{|x,y| x.created_at <=> y.created_at }
end
end
# and in the erb:
<% current_user.watched_comments[0,10].each do |comment| %>
<%= comment.user.name %> just commented on <%= comment.workout.title %>:
<div><%= comment.text %></div>
<% end %>
Есть немного неприятных n + 1 запрос фуздесь происходит, что не может быть реальным исполнителем, хотя.С другой стороны, вы можете попытаться сделать все в прямой SQL, который будет работать лучше.Что-то вроде (sql ninjas, без сомнения, могло бы быть лучше):
EDIT: вы также можете добавить опцию 'limit' непосредственно в SQL
has_many :watched_comments, :class_name => 'Comment', :finder_sql => 'select * from comments, workouts where comments.workout_id = workout.id and workouts.id in (select workouts.id from workouts, comments where workouts.id = comments.id and comments.user_id = #{id}) order by comments.created_at desc limit 10'