我有以下课程:
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'。
从我的实际代码评论中可以看出,我不知道为什么。当我进入控制台并明确设置组的领导时,一切似乎都正常。
有人理解为什么会这样吗?
(顺便提一下,该方法的目的是在前一个领导者变为非活动状态时更新组的领导者。新领导者是登录次数最多的领导者。)
答案 0 :(得分:3)
尝试在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对它们进行排序 - 当您的用户数据库变大时,效率会更高。