ActiveRecord Tips
Author: KDr2
8
Feb
通过through多对多的结构联合查询的时候尽量用中间表的find,然后include其他两个Entity:
- class LeftEntity < ActiveRecord::Base
- set_table_name "t_left"
- has_many :relation_entity,
- :class_name=>"RelationEntity",
- :foreign_key=>"left_id"
- has_many :right,
- :class_name=>"RightEntiy",
- :through=>:relation_entity,
- :source=>:right
- end
-
- class RightEntity < ActiveRecord::Base
- set_table_name "t_right"
- has_many :relation_entity,
- :class_name=>"RelationEntity",
- :foreign_key=>"right_id"
- has_many :left,
- :class_name=>"LeftEntiy",
- :through=>:relation_entity,
- :source=>:left
- end
-
- class RelationEntity < ActiveRecord::Base
- set_table_name "t_relation"
- belongs_to :left,
- :class_name=>"LeftEntiy",
- :foreign_key=>"left_id"
- belongs_to :right,
- :class_name=>"RightEntiy",
- :foreign_key=>"right_id"
- end
联合查询的时候尽量这样:
- rst=RelationEntity.find(
- :all,
- :include=>[:left,:right],
- :order=>"#{LeftEntity.table_name}.id",
- :conditions=>["#{RelationEntity.table_name}.relation_column = ?",...]
- )
order,conditions等语句中需要表名时尽量用 #{TheModel.table_name},不要用真正的table name,以免表名变更后的代码维护(尽管表名变更很少出现,但是我最近还是碰到了 :P)。
Leave a reply