1

次のモデルが与えられた場合

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を割り当てに設定するにはどうすればよいですか?

4

0 に答える 0