Reputation: 11247
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
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