次のモデル/関連付けのセットアップがあります。
class Contact < ActiveRecord::Base
has_and_belongs_to_many :assigned_users, class_name: 'User'
def auto_assign_team_member(project)
team = project.teams(true).order('last_assigned_contact_at ASC').first
if team && (user = team.user)
self.assigned_users << user
team.update_attribute(:last_assigned_contact_at, Time.now)
end
end
end
class Team < ActiveRecord::Base
belongs_to :user
belongs_to :project
end
class User < ActiveRecord::Base
has_many :teams
has_many :projects, through: :teams
has_and_belongs_to_many :assigned_contacts, class_name: 'Contact'
end
class Project < ActiveRecord::Base
has_many :teams
has_many :users, through: :teams
end
Contact
メソッドをトラバースして実行するインスタンスのコレクションもありますauto_assign_team_member
。私の問題は、ほとんどすべての実行team
で lvar が同じチームを返すことです。テーブルには 2 つのレコードがあり、チーム メンバーをアソシエーションに均等に分配することを意図しています。teams
Contact#assigned_users
コンソールでは、次のように動作します。
project.teams(true).order('last_assigned_contact_at ASC').first #=> Team(user_id: 1)
project.teams(true).order('last_assigned_contact_at ASC').first.update_attribute(:last_assigned_contact_at, Time.now)
project.teams(true).order('last_assigned_contact_at ASC').first #=> Team(user_id: 2)
ここでどこが間違っているのか分かりますか?
編集誰かが興味を持っている場合は、これを再現する小さなアプリケーションを作成しましたhttps://github.com/injekt/teamr
簡単に実行rake db:seed
してテスト データを実行できます。出力は、毎回同じユーザーを表示するのではなく、各ユーザーに均等に分散する必要があります。
EDIT 結局のところ、update_attribute(:last_assigned_contact_at, 'now()')
代わりに実行するとうまくいきます。では、Rails は何かファンキーなことを内部で行っているのでしょうか? これには高い精度が必要だと思いますが、レールはそれを処理できると思います