オブジェクト指向ビルダーDSLを介してSQLを構築することと、生のSQL文字列をパラメーター化することの利点を理解しようとしています。同じクエリを3つの方法で調査/実装した後、生のSQLがはるかに読みやすいことに気付きました。これは、「なぜフープを飛び越えるのか」という疑問を投げかけます。生のSQLを宣言して使用しないのはなぜですか?
これが私が思いついたものです:
まず、アダプターを使用する任意のDBで使用できるため、SQLの移植性が向上すると思います。これが大物だと思いますよね?それでも、ほとんどのT-SQLはほとんどのデータベースで理解できませんか?
次に、他のクエリ、名前付きスコープのチェーンなどの基礎として再利用できるクエリオブジェクトを提供します。
SQLを宣言するのではなく構築することで実現する主な投資収益率はどれくらいですか?
def instances_of_sql(ttype_id) #raw sql
ttype_id = get(ttype_id).try(:id)
ti = get('tmdm:type-instance')
inst = get('tmdm:instance')
type = get('tmdm:type')
self.class.send :sanitize_sql, [%{
SELECT t.*
FROM associations a
JOIN roles type ON type.association_id = a.id AND type.ttype_id = ?
JOIN roles inst ON inst.association_id = a.id AND inst.ttype_id = ?
JOIN topics t ON t.id = inst.topic_id
WHERE a.topic_map_id IN (?)
AND a.ttype_id = ?
AND type.topic_id = ?
}, type.id, inst.id, self.ids, ti.id, ttype_id]
end
def instances_of_sql(ttype_id) #sequel
ttype_id = get(ttype_id).try(:id)
ti = get('tmdm:type-instance')
ir = get('tmdm:instance')
tr = get('tmdm:type')
DB.from(:associations.as(:a)).
join(:roles.as(:tr), :tr__association_id => :a__id, :tr__ttype_id => tr[:id]).
join(:roles.as(:ir), :ir__association_id => :a__id, :ir__ttype_id => ir[:id]).
join(:topics.as(:t), :t__id => :ir__topic_id).
where(:a__topic_map_id => self.ids).
where(:a__ttype_id => ti[:id]).
where(:tr__topic_id => ttype_id).
select(:t.*).sql
end
def instances_of_sql(ttype_id) #arel
ttype_id = get(ttype_id).try(:id)
ti = get('tmdm:type-instance')
inst = get('tmdm:instance')
type = get('tmdm:type')
#tables
t = Topic.arel_table
a = Association.arel_table
tr = Role.arel_table
ir = tr.alias
a.
join(tr).on(tr[:association_id].eq(a[:id]),tr[:ttype_id].eq(type[:id])).
join(ir).on(ir[:association_id].eq(a[:id]),ir[:ttype_id].eq(inst[:id])).
join(t).on(t[:id].eq(ir[:topic_id])).
where(a[:topic_map_id].in(self.ids)).
where(a[:ttype_id].eq(ti[:id])).
where(tr[:topic_id].eq(ttype_id)).
project('topics.*').to_sql
end
名前付きスコープに心から感謝し、それらを連鎖させることがいかに有益であるかを理解しています。モデルを介して関連レコードにアクセスすることについては心配していません。私は純粋に複雑なクエリを構築することについて話している。