著作一覧 |
SQLアンチパターン Entity Attribute Valueというのがあって、アンチパターンとされるのはわかるわけだが、そうはいってもそう作られてしまったものを扱う必要もあったりする。
で、「データの取得が冗長化する」は確かにすごくイヤなわけだが、考えてみたら、実はそうでもない。
この例であれば
欲しいattr_nameの値は見えているわけだからsql = [nil, 'エンジニアになろう'] sql[0] =<<EOD select eav1.book_id ,eav1.attr_value as name ,eav2.attr_value as status ,eav3.attr_value as creater from books eav1 left join books eav2 on eav1.book_id=eav2.book_id and eav2.attr_name='status' left join books eav3 on eva1.book_id=eav3.book_id and eav3.attr_name='creater' where eav1.attr_name='name' and eav1.attr_value=? EOD puts Book.connection.select_all(Book.sanitize_sql_array(sql))[0].inspect
で良い(それは糞面倒だろうというのはまったく否定しないが、SQLは冗長だがそれほど取得が冗長とは思えないんだよな)。
ジェズイットを見習え |