The following query is doing some weird shit in my database:

>> User.active.find_by_activity({:limit => 5, :require_avatar => false})
ActiveRecord::RecordNotFound: Couldn't find User with ID=10
        from 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/base.rb:1591:in
 `find_one'
        from 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/base.rb:1574:in
 `find_from_ids'
        from 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/base.rb:616:in 
`find_without_pagination'
        from 
/apps/thecommunity/releases/20100509205223/vendor/plugins/community_engine/plugins/paginating_find/lib/paginating_find.rb:103:in
 `find'
        from 
/apps/thecommunity/releases/20100509205223/vendor/plugins/community_engine/app/models/user.rb:93:in
 `find'
        from 
/apps/thecommunity/releases/20100509205223/vendor/plugins/community_engine/app/models/user.rb:165:in
 `find_by_activity'
        from 
/apps/thecommunity/releases/20100509205223/vendor/plugins/community_engine/app/models/user.rb:165:in
 `map'
        from 
/apps/thecommunity/releases/20100509205223/vendor/plugins/community_engine/app/models/user.rb:165:in
 `find_by_activity'
        from 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/named_scope.rb:186:in
 `send'
        from 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/named_scope.rb:186:in
 `method_missing'
        from 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/base.rb:2148:in
 `with_scope'
        from (__DELEGATION__):2:in `__send__'
        from (__DELEGATION__):2:in `with_scope'
        from 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/named_scope.rb:179:in
 `method_missing'
        from (irb):20

There are two things that are weird about this:

1) There is, indeed, a user with that ID:

>> u = User.find(10)
=> #<User id: 10, login: "devsample", email: "[email protected]", 
description: "", avatar_id: nil, crypted_password: 
"1ce245b87890a2323e7a67087415b1eb976bd9f3", salt: 
"bc615491c6881df432e99cf24b71712f520dd41a", created_at: "2010-02-24 22:27:30", 
updated_at: "2010-05-11 21:24:05", remember_token: nil, 
remember_token_expires_at: nil, stylesheet: nil, view_count: 3, vendor: false, 
activation_code: "c2f28946842f9822491e4f417d68978b0c63606c", activated_at: nil, 
state_id: nil, metro_area_id: nil, login_slug: "devsample", notify_comments: 
false, notify_friend_requests: true, notify_community_news: false, country_id: 
nil, featured_writer: false, last_login_at: "2010-02-24 22:31:08", zip: nil, 
birthday: "1980-01-01", gender: nil, profile_public: true, activities_count: 2, 
sb_posts_count: 0, sb_last_seen_at: "2010-05-11 21:22:00", role_id: 3, 
first_name: "Dev", middle_name: "", last_name: "Sample", company_id: nil, 
employer_id: nil, interests: "", community_hopes: "", community_promises: "", 
job_favorites: "", job_title: "">

2) That user isn't active so it shouldn't be within the User.active named scope 
and therefore should never be found by the find_by_activity query (should it?):

>> u.active?
=> false
>> u.activated_at
=> nil

Anyone have any idea what's going on here?  Looking at the code in user.rb it's 
kind of unclear to me how this function can limit the users found to those 
within the :active named scope because it just does a :

  def self.find_by_activity(options = {})
    options.reverse_merge! :limit => 30, :require_avatar => true, :since => 
7.days.ago   
    #Activity.since.find(:all,:select => Activity.columns.map{|column| 
Activity.table_name + "." + column.name}.join(",")+', count(*) as count',:group 
=> Activity.columns.map{|column| Activity.table_name + "." + 
column.name}.join(","),:order => 'count DESC',:joins => "LEFT JOIN users ON 
users.id = activities.user_id" )
    #Activity.since(7.days.ago).find(:all,:select => 'activities.user_id, 
count(*) as count',:group => 'activities.user_id',:order => 'count DESC',:joins 
=> "LEFT JOIN users ON users.id = activities.user_id" )
    activities = Activity.since(options[:since]).find(:all, 
      :select => 'activities.user_id, count(*) as count', 
      :group => 'activities.user_id', 
      :conditions => "#{options[:require_avatar] ? ' users.avatar_id IS NOT 
NULL' : nil}", 
      :order => 'count DESC', 
      :joins => "LEFT JOIN users ON users.id = activities.user_id",
      :limit => options[:limit]
      )
    activities.map{|a| find(a.user_id) }
  end  

And, in fact, if I do it without the named scope it works fine:

>> users = User.find_by_activity({:limit => 5, :require_avatar => false}); nil
=> nil
>> users.include?(u)
=> true

So, it looks like the :active named scope doesn't actually change which users 
self.find_by_activity will find (because that isn't a generic ActiveRecord 
finder method, I assume), but *does* make ActiveRecord think that users that 
don't meet the conditions in that named scope aren't in the database.  Anyone 
have any suggestions?  This is making the site crash because this user updated 
their profile before deactivating and that profile update is one of the most 
recent activities.




-- 
You received this message because you are subscribed to the Google Groups 
"CommunityEngine" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/communityengine?hl=en.

Reply via email to