■has_manyまたはhbtmに対しては、その属性自体もfindメソッドを持つ
user.flags.find_all_by_flaggable_to_type("Diary")
※flagsというのはポリモフィックアソシエーション用に使っている
そのユーザが仮想的なメールのやりとりをする場合、次のようなコードが考えられる。
注目すべきは、User#sent_mailsで、self.flags.findとなっているところ
class Flag < ActiveRecord::Base belongs_to :flaggable_to, :polymorphic => true belongs_to :user end class Mail < ActiveRecord::Base belongs_to :user has_one :flag, :as => :flaggable_to, :dependent => :destroy def get_sender if flag return flag.user else return nil end end def get_receiver return self.user end class User < ActiveRecord::Base has_many :flags, :dependent => :destroy has_many :mails, :dependent => :destroy def received_mails r_mails = self.mails end def sent_mails mail_flags = self.flags.find( :all, :conditions => ["flaggable_to_type = ?","Mail"], :order => "created_at DESC" ) s_mails = mail_flags.collect(&:flaggable_to) end end
なお、メールとフラグとユーザーの関係はこんな感じ。実際、開発時にこの図を使った。
fはフラグのf