通过through多对多的结构联合查询的时候尽量用中间表的find,然后include其他两个Entity:

  1. class LeftEntity < ActiveRecord::Base
  2.   set_table_name "t_left"
  3.   has_many :relation_entity,
  4.                 :class_name=>"RelationEntity",
  5.                 :foreign_key=>"left_id"
  6.   has_many :right,
  7.                 :class_name=>"RightEntiy",
  8.                 :through=>:relation_entity,
  9.                 :source=>:right
  10. end
  11.  
  12. class RightEntity < ActiveRecord::Base
  13.   set_table_name "t_right"
  14.   has_many :relation_entity,
  15.                 :class_name=>"RelationEntity",
  16.                 :foreign_key=>"right_id"
  17.   has_many :left,
  18.                 :class_name=>"LeftEntiy",
  19.                 :through=>:relation_entity,
  20.                 :source=>:left
  21. end
  22.  
  23. class RelationEntity < ActiveRecord::Base
  24.   set_table_name "t_relation"
  25.   belongs_to :left,
  26.                  :class_name=>"LeftEntiy",
  27.                  :foreign_key=>"left_id"
  28.   belongs_to :right,
  29.                  :class_name=>"RightEntiy",
  30.                  :foreign_key=>"right_id"
  31. end

联合查询的时候尽量这样:

  1. rst=RelationEntity.find(
  2.   :all,
  3.   :include=>[:left,:right],
  4.   :order=>"#{LeftEntity.table_name}.id",
  5.   :conditions=>["#{RelationEntity.table_name}.relation_column = ?",...]
  6.   )

order,conditions等语句中需要表名时尽量用 #{TheModel.table_name},不要用真正的table name,以免表名变更后的代码维护(尽管表名变更很少出现,但是我最近还是碰到了 :P)。