has_manyとfind

■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