1

我有以下课程:

class Group < ActiveRecord::Base

  has_many   :users 
  belongs_to :leader, :foreign_key => "leader_id", :class_name => "User"

  def get_leader!
    if leader.try(:is_active?)
      return leader
    else
      leader = users.active.sort_by { |u| u.completed_sessions }.last
      save! # TODO: this does not save the new leader ... no idea why
      return leader
    end
  end    

end

当我调用 get_leader 时!方法它总是返回正确的领导者,但无法更新对象的foreign_key 'leader_id'。

正如您从我的实际代码注释中看到的那样,我不知道为什么。当我转到控制台并明确设置组的领导者时,一切似乎都正常。

有谁明白为什么会这样?

(顺便说一句,该方法的目的是在前一个领导者变为非活动状态时更新一个组的领导者。新领导者是登录次数最多的领导者。)

4

1 回答 1

3

尝试在前面添加 self leader

self.leader = users.active.sort_by{|u| u.completed_sessions}.last
save!

这在 Ruby 赋值中是必要的,因为 Ruby 不知道leader是该方法的本地变量还是对象上的赋值方法self

另外,如果completed_sessions是数据库列,我会考虑使用此代码来提取正确的用户:

self.leader = users.active.order("completed_sessions DESC").first

这将使用您的数据库查询对数据库进行排序,而不是提取所有记录并让 Ruby 对它们进行排序 - 当您的用户数据库变得更大时效率更高。

于 2012-06-19T05:24:16.413 回答