2011-06-24 19 views
4

アソシエーション拡張を介して多くのものをセットアップすることは可能ですか?私は持っています:多くのスルーアソシエーション拡張がある

class User < ActiveRecord::Base 

    has_many :friendships do 
    def accepted 
     where status: "accepted" 
    end 
    def rejected 
     where status: "rejected" 
    end 
    end 

    has_many :friends, through: :friendships do 
    def accepted 
     # Something equivalent to the following using association extension: 
     # where("friendships.status = 'accepted'") 
    end 
    def rejected 
     # Something equivalent to the following using association extension: 
     # where("friendships.status = 'rejected'") 
    end 
    end 

end 

フレンドシップ協会のエクステンションを使って友人関係をセットアップできますか?

答えて

0

あなたがwhere関係のためAREL式を使用する場合は、それらのメソッドをバインド解除し、friends協会にそれらを再バインドすることができます

class User < ActiveRecord::Base 
    has_many :friendships do 
    def accepted 
     where(Friendship.arel_table[:status].eq('accepted')) 
    end 
    def rejected 
     where(Friendship.arel_table[:status].eq('rejected')) 
    end 
    end 

    has_many :friends, through: :friendships do 
    def accepted 
     proxy_association.owner.friendships.extensions.first.instance_method(:accepted).bind(self).call 
    end 
    def rejected 
     proxy_association.owner.friendships.extensions.first.instance_method(:rejected).bind(self).call 
    end 
    end 
end 

付きそのコードでは、SQLが正しく生成されるため、このテストは次のように渡されます。

def test_stuff 
    tom = User.create! name: "tom" 
    fred = Friend.create! name: "fred" 
    jerry = Friend.create! name: "jerry" 
    Friendship.create! user: tom, friend: fred, status: 'accepted' 
    Friendship.create! user: tom, friend: jerry, status: 'rejected' 
    tom.reload 
    fred.reload 
    assert_equal "fred", tom.friends.accepted.first.name 
    assert_equal "jerry", tom.friends.rejected.first.name 
end 
0

私の心に来る最初のもの:

class User < ActiveRecord::Base 

    has_many :accepted_friendships, :class_name => "Friendship", :conditions => ... 
    has_many :accepted_friends, through => :accepted_friendhips, :source => :friend 

end 
+0

可能であれば、関連付け拡張機能で動作するメソッドを見つけて、このメソッドを使用して実行できることを認識しています。ありがとう。 –

関連する問題