活动记录搜索查询

时间:2013-12-10 00:46:45

标签: mysql ruby-on-rails activerecord

我正在尝试执行以下操作:

1)从我的投票表中获取当前评论ID的所有投票(我有此工作)

2)从评论表中获取值“得分”。两个Active Record Queries几乎完全相同(我相信正确)。这是我的这两个表(投票和评论)和我的评论控制器的架构。

3)我需要在我的评论模型中定义的方法中使用“得分”这个值。

ActiveRecord::Schema.define(version: 20131207224402) do

  create_table "comments", force: true do |t|
    t.integer  "user_id"
    t.integer  "question_id"
    t.text     "comment"
    t.integer  "upvotes"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "score"
  end

 create_table "votes", force: true do |t|
     t.integer  "comment_id"
     t.integer  "user_id"
     t.integer  "upvote"
     t.integer  "downvote"
     t.datetime "created_at"
     t.datetime "updated_at"
   end

end 

这是我的评论模型

class Comment < ActiveRecord::Base
  belongs_to :question
  belongs_to :user
  has_many :votes


  def total_score

    total_votes = Vote.where(:comment_id => self.id)
    current_score = Comment.where(:id => self.id)    ##This is the query that is not working properly.

    testing = current_score.score

    total_score ||= 0
    up = total_votes.inject(testing) {|sum, v|
      v.upvote ||= 0
      sum + v.upvote
    }
    down = total_votes.inject(testing) {|sum,v|
      v.downvote ||= 0
      sum + v.downvote
    }

    up.to_i + down.to_i

  end

end

为什么我不能使用.score来获取查询返回的变量的得分值?

Ex:current_score.score ='some number'

我需要这个数字来设置我的注入方法中的当前“总和”。

以下是我遇到的错误:

ActionView::Template::Error (undefined method `score' for #<ActiveRecord::Relation::ActiveRecord_Relation_Comment:0x007fbfcc7e9260>):
    1: json.array!(@comments) do |comment|
    2:   json.extract! comment, :user_id, :question_id, :comment, :upvotes, :id, :score, :created_at
    3:   json.url comment_url(comment, format: :json)
    4:   json.comment_score comment.total_score
    5: end
  app/models/comment.rb:14:in `total_score'
  app/views/comments/index.json.jbuilder:4:in `block in _app_views_comments_index_json_jbuilder__2724241289986061767_70230927807240'
  app/views/comments/index.json.jbuilder:1:in `_app_views_comments_index_json_jbuilder__2724241289986061767_70230927807240'


  Rendered /Users/ScottDAlessandro/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.5ms)
  Rendered /Users/ScottDAlessandro/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.3ms)
  Rendered /Users/ScottDAlessandro/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/template_error.erb within rescues/layout (13.2ms)

1 个答案:

答案 0 :(得分:1)

我认为你的问题是current_score = Comment.where(:id => self.id)正在返回一个数组。尝试将该代码更改为:

current_score = Comment.find(self.id)

以下是有关findwhere的stackoverflow讨论的链接: https://stackoverflow.com/a/9574674/2925963