次のモデルが与えられた場合
class Team < ActiveRecord::Base
has_many :memberships, class_name: "TeamMembership"
has_many :members, -> { uniq(true) }, source: :user, through: :memberships
has_many :owners, -> { where('team_memberships.owner' => true) }, source: :user, through: :memberships
end
これは十分に機能します(奇妙なuniq
構文は、私がRails 4を使用しているためです)が、私の仕様では:
describe Team do
describe "users and owners" do
fixtures :users
subject { create :team }
let(:bob) { users :bob }
let(:alice) { users :alice }
it "doesn't allow a member to be added more than once" do
subject.members << bob
subject.members.should include(bob)
subject.members << bob
subject.members.count.should == 1
end
it "doesn't allow an owner to be added more than once" do
subject.owners << bob
subject.owners.should include(bob)
subject.owners << bob
subject.owners.count.should == 1
end
end
end
2 番目の例「所有者を複数回追加することは許可されていません」がbob
、所有者リストに正しく追加されているかどうかを確認しているのに気付くでしょう。彼はそうではありません。彼はmember
リストに載っていますが、彼のTeamMembership
インスタンスにはowner = true
フラグがありません。
Railsの以前のバージョンでこれが機能していたと確信していますが、それはconditions: { owner: true }
遅延評価されたラムダではなく、関係のオプションであったときです。
次のようにして回避できます。
subject.owners << bob
subject.members.should include(bob)
subject.memberships.find_by_user_id(bob.id).update_attribute(:owner, true)
これは十分に機能しますが、長い道のりのようです。要するにowners<<()
、モデルをオーバーライドしてTeam
そこから実行する方法が必要ですが、どこから始めればよいかわかりません。短期的には、私の回避策で十分ですが、もっとうまくやればよかったのにと思います。
team.owners << bob
彼の新しく作成されたメンバーシップteam_membership.owner = true
を割り当てに設定するにはどうすればよいですか?