| 著作一覧 |
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は冗長だがそれほど取得が冗長とは思えないんだよな)。
ジェズイットを見習え |