【问题标题】:How do I call all comments for a post (workout in this case) where workout.user_id == current_user.id?如何调用锻炼.user_id == current_user.id 的帖子(在这种情况下为锻炼)的所有评论?
【发布时间】:2010-12-01 16:00:51
【问题描述】:

我创建了一个 Ruby on Rails 应用程序,用户可以在其中记录他们的锻炼,其他用户可以对这些锻炼发表评论。我正在使用仪表板资源来汇总 current_user 的信息。我正在尝试在 current_user 的锻炼中显示最近的 cmets,但似乎无法弄清楚如何正确执行此操作。我想我需要一个我还不擅长的 named_scope。

我本质上希望应用程序循环遍历 cmets 表,但只在其中锻炼.user_id == 到 current_user.id 的锻炼上返回 cmets。

/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 

*我认为我不需要在他们的@workouts 行中,但无论如何都要放它。

【问题讨论】:

    标签: ruby-on-rails ruby named-scope


    【解决方案1】:

    假设您已正确设置模型,您可以尝试以下方法:

    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
    

    【讨论】:

    • +1 用于将 named_scope 与 lambda 一起使用。只是,订单和限制不需要创建一个,使用内置的ActiveRecord方式,就像原帖说的那样。
    • 这些仅在 Rails 3 中可用,或者如果您使用 Rails 2.x 的 ActiveRecord 反向端口
    • 是的,我在这个项目中使用的是 2.3.8
    • 使用上述SQLite3::SQLException: no such column: workout.user_id: SELECT "comments".* FROM "comments" INNER JOIN "workouts" ON "workouts".id = "comments".workout_id WHERE (workout.user_id = 1) 时出现此错误
    • 对不起,应该是“workouts.user_id = ?”在条件。我已经更新了这个
    【解决方案2】:

    正确的做法是在模型之间建立关系,即评论和锻炼。每个锻炼可以有很多个cmet,每个评论都属于一个锻炼。所以:

    class Comment < ActiveRecord::Base
          belongs_to :workout
    
          # rest of the model definitions
    end
    

    class Workout < ActiveRecord::Base
          has_many :comments
    
          # rest of the model definitions
    end
    

    这样设置好之后,就可以调用了:

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

    您可以按照here 的示例进行操作。

    【讨论】:

    • 我已经建立了这种关系。当我使用@workout.cmets 做|comment|我得到 undefined method cmets' 的 nil:NilClass`
    • 那么,我猜你的设置有问题。进一步挖掘。在控制台中工作可能更容易。
    • 您可以在 freenode 上的#rubyonrails IRC 频道中获得即时在线帮助:webchat.freenode.net
    • 我怀疑你的@workout 实际上是未定义的。您是否尝试遍历@workouts 中的所有内容?如果是这样,局部变量很可能是锻炼而不是@workout
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    相关资源
    最近更新 更多