twitter / activerecord-reputation-system

An Active Record Reputation System for Rails
Apache License 2.0
1.33k stars 122 forks source link

TypeError - Array can't be coerced into Float: #42

Open ericpeters0n opened 11 years ago

ericpeters0n commented 11 years ago

SHORTENED FOR BREVITY: Basically, this error can occur if the reputation model is defined using invalid syntax...

HOWEVER, It can also apparently occur when syntax is kosher according to the Github docs.

ericpeters0n commented 11 years ago

Solved! See above.

kn commented 11 years ago

Good to hear you solved it. Please close this issue :)

ericpeters0n commented 11 years ago

Found another instance of this, even using the correct syntax...

class Link < ActiveRecord::Base

  belongs_to :folder
  belongs_to :user

  has_reputation :avg_rating,
      :source => :user,
      :aggregated_by => :average,
      :source_of => [{ :reputation => :karma, :of => :folder },
                     { :reputation => :karma, :of => :user }]

  has_reputation :views,
      :source => :user,
      :source_of => [{ :reputation => :link_views, :of => :folder }]

  has_reputation :karma,
      :source => [{ :reputation => :avg_rating },
                            { :reputation => :views }],
      :aggregated_by => :product,
      :source_of => [{ :reputation => :karma, :of => :user }, 
                             { :reputation => :karma, :of => :folder }]

Relevant portion of the stack trace:

TypeError: Array can't be coerced into Float
    from /Users/Eric/.rvm/gems/ruby-1.9.2-p320@linksee_demo/gems/activerecord-reputation-system-2.0.2/lib/reputation_system/models/reputation.rb:87:in `*'
    from /Users/Eric/.rvm/gems/ruby-1.9.2-p320@linksee_demo/gems/activerecord-reputation-system-2.0.2/lib/reputation_system/models/reputation.rb:87:in `update_reputation_value_with_updated_source'
    from /Users/Eric/.rvm/gems/ruby-1.9.2-p320@linksee_demo/gems/activerecord-reputation-system-2.0.2/lib/reputation_system/models/reputation.rb:163:in `update_reputation_value'
    from /Users/Eric/.rvm/gems/ruby-1.9.2-p320@linksee_demo/gems/activerecord-reputation-system-2.0.2/lib/reputation_system/models/reputation.rb:151:in `send_reputation_message_to_receiver'
    from /Users/Eric/.rvm/gems/ruby-1.9.2-p320@linksee_demo/gems/activerecord-reputation-system-2.0.2/lib/reputation_system/models/reputation.rb:140:in `block (2 levels) in propagate_updated_reputation_value'
    from /Users/Eric/.rvm/gems/ruby-1.9.2-p320@linksee_demo/gems/activerecord-reputation-system-2.0.2/lib/reputation_system/models/reputation.rb:138:in `each'
    from /Users/Eric/.rvm/gems/ruby-1.9.2-p320@linksee_demo/gems/activerecord-reputation-system-2.0.2/lib/reputation_system/models/reputation.rb:138:in `block in propagate_updated_reputation_value'
    from /Users/Eric/.rvm/gems/ruby-1.9.2-p320@linksee_demo/gems/activerecord-reputation-system-2.0.2/lib/reputation_system/models/reputation.rb:136:in `each'
    from /Users/Eric/.rvm/gems/ruby-1.9.2-p320@linksee_demo/gems/activerecord-reputation-system-2.0.2/lib/reputation_system/models/reputation.rb:136:in `propagate_updated_reputation_value'
    from /Users/Eric/.rvm/gems/ruby-1.9.2-p320@linksee_demo/gems/activerecord-reputation-system-2.0.2/lib/reputation_system/models/reputation.rb:97:in `update_reputation_value_with_updated_source'
    from /Users/Eric/.rvm/gems/ruby-1.9.2-p320@linksee_demo/gems/activerecord-reputation-system-2.0.2/lib/reputation_system/models/reputation.rb:163:in `update_reputation_value'
    from /Users/Eric/.rvm/gems/ruby-1.9.2-p320@linksee_demo/gems/activerecord-reputation-system-2.0.2/lib/reputation_system/models/reputation.rb:151:in `send_reputation_message_to_receiver'
    from /Users/Eric/.rvm/gems/ruby-1.9.2-p320@linksee_demo/gems/activerecord-reputation-system-2.0.2/lib/reputation_system/models/reputation.rb:140:in `block (2 levels) in propagate_updated_reputation_value'
    from /Users/Eric/.rvm/gems/ruby-1.9.2-p320@linksee_demo/gems/activerecord-reputation-system-2.0.2/lib/reputation_system/models/reputation.rb:138:in `each'
    from /Users/Eric/.rvm/gems/ruby-1.9.2-p320@linksee_demo/gems/activerecord-reputation-system-2.0.2/lib/reputation_system/models/reputation.rb:138:in `block in propagate_updated_reputation_value'
    from /Users/Eric/.rvm/gems/ruby-1.9.2-p320@linksee_demo/gems/activerecord-reputation-system-2.0.2/lib/reputation_system/models/reputation.rb:136:in `each'
    from /Users/Eric/.rvm/gems/ruby-1.9.2-p320@linksee_demo/gems/activerecord-reputation-system-2.0.2/lib/reputation_system/models/reputation.rb:136:in `propagate_updated_reputation_value'
    from /Users/Eric/.rvm/gems/ruby-1.9.2-p320@linksee_demo/gems/activerecord-reputation-system-2.0.2/lib/reputation_system/models/reputation.rb:97:in `update_reputation_value_with_updated_source'
    from /Users/Eric/.rvm/gems/ruby-1.9.2-p320@linksee_demo/gems/activerecord-reputation-system-2.0.2/lib/reputation_system/evaluation_methods.rb:66:in `update_evaluation'
    from /Users/Eric/.rvm/gems/ruby-1.9.2-p320@linksee_demo/gems/activerecord-reputation-system-2.0.2/lib/reputation_system/evaluation_methods.rb:72:in `add_or_update_evaluation'

...which seems to suggest that it's in the propagation of the updated evaluation into the dependent (source_of) models that the problems arise.

So here those are:

class Folder < ActiveRecord::Base
    belongs_to :owner, :class_name => "User"
    has_many :links, :order => 'created_at DESC'
    has_reputation :link_views,
      :source => [{ :reputation => :views, :of => :links }]
    has_reputation :karma,
      :source => [{ :reputation => :avg_rating, :of => :links }],
      :source_of => [{ :reputation => :karma, :of => :owner }]
class User < ActiveRecord::Base
  has_many :folders, :foreign_key => :owner_id
  has_many :links
  has_reputation :karma,
    :source => [{ :reputation => :karma, :of => :links }],
    :aggregated_by => :sum
ericpeters0n commented 11 years ago

Confirmation (from somebody totally different... simply executing the tutorial code...) here: http://www.neilmarion.com/index.php/twitter-activerecord-reputation-system-the-dreaded-array-cant-be-coerced-into-float-error/