HelloWorld
HelloWorld

Reputation: 11247

Active Record Search Query

I am trying to do the following:

1) Get all the Votes from my Vote Table with the current comment id (I have this working)

2) Get the value "score" from the Comments Table. Both Active Record Queries are almost identical (and I believe right). Here is my Schema for these two tables (Vote and Comment) and my Comment Controller.

3) I need this value of "score" to use in a method I have defined in my Comments Model.

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 

Here is my Comments Model

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

Why can't I use .score to get the value of score on the variable the query is returning?

Ex: current_score.score = 'some number'

I need this number to set the current "sum" in my inject method.

Here is the error I am getting:

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)

Upvotes: 0

Views: 101

Answers (1)

RustyToms
RustyToms

Reputation: 7810

I think your problem is that current_score = Comment.where(:id => self.id) is returning an array. Try changing that code to this:

current_score = Comment.find(self.id)

Here is a link to a stackoverflow discussion about find vs. where: https://stackoverflow.com/a/9574674/2925963

Upvotes: 1

Related Questions