开发者

How do I call all comments for a post (workout in this case) where workout.user_id == current_user.id?

开发者 https://www.devze.com 2023-01-28 02:05 出处:网络
I have created a Ruby on Rails app where users can record their workouts and other users can comment on those workouts. I am using a Dashboard resource to aggregate information for current_user. I am

I have created a Ruby on Rails app where users can record their workouts and other users can comment on those workouts. I am using a Dashboard resource to aggregate information for current_user. I am trying to display recent comments on a current_user's workouts but can't seem to figure out how to do this correctly. I think I need a named_scope which I am not great at yet.

I essentially want the app to loop through the comments table but only return comments on Workouts where workout.user_id == to current_user.id.

/views/dashboard/index.html.erb

<% @comments.each 开发者_运维技巧do |comment| %> 
  <%= link_to (comment.user.username), comment.user %><br/>
  <%= time_ago_in_words(comment.created_at) %><br/>
  <%= link_to (comment.workout.title), comment.workout %><br/>
<% end %>

dashboard_controller.rb

def index
  @comments = Comment.all(:order => "created_at DESC", :limit => 10)
  @workouts = Workout.all(:order => "created_at DESC", :limit => 10) 
end 

*I don't think I need the @workouts line in their but put it anyway.


Assuming that you have the models setup properly, here's something you can try:

class Comment < ActiveRecord::Base
  named_scope :for_user, lambda { |user| { :joins => :workout, :conditions => ["workouts.user_id = ?", user.id] } }
  named_scope :order, lambda { |order| { :order => order } }
  named_scope :limit, lambda { |limit| { :limit => limit } }
end

class DashboardsController < ApplicationController
  def index
    @comments = Comment.for_user(current_user).order("created_at DESC").limit(10)
  end
end


The proper way to do is to put relations between your models, i.e. comment and workout. Each workout can have many comments, and each comment belongs to a workout. So:

class Comment < ActiveRecord::Base
      belongs_to :workout

      # rest of the model definitions
end

and

class Workout < ActiveRecord::Base
      has_many :comments

      # rest of the model definitions
end

Once you set it up like this, then you can call:

<% @workout.comments do |comment| %> 
   <!-- print comment here -->
<% end %>

You can follow the example here.

0

精彩评论

暂无评论...
验证码 换一张
取 消