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そのメソッドに対してローカルな変数なのか、それとも object の代入メソッドなのかがわからないためselfです。

また、completed_sessionsデータベース列の場合、次のコードを使用して正しいユーザーを取得することを検討します。

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

これは、すべてのレコードを取得して Ruby に並べ替える代わりに、データベース クエリを使用してデータベースを並べ替えます。ユーザー データベースが大きくなると、より効率的になります。

于 2012-06-19T05:24:16.413 に答える