aboutsummaryrefslogtreecommitdiffstats
path: root/lib/arel/engines/sql/relations/writes.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/arel/engines/sql/relations/writes.rb')
-rw-r--r--lib/arel/engines/sql/relations/writes.rb39
1 files changed, 39 insertions, 0 deletions
diff --git a/lib/arel/engines/sql/relations/writes.rb b/lib/arel/engines/sql/relations/writes.rb
new file mode 100644
index 0000000000..f1a9bfd2ac
--- /dev/null
+++ b/lib/arel/engines/sql/relations/writes.rb
@@ -0,0 +1,39 @@
+module Arel
+ class Deletion < Compound
+ def to_sql(formatter = nil)
+ build_query \
+ "DELETE",
+ "FROM #{table_sql}",
+ ("WHERE #{wheres.collect(&:to_sql).join('\n\tAND ')}" unless wheres.blank? ),
+ ("LIMIT #{taken}" unless taken.blank? )
+ end
+ end
+
+ class Insert < Compound
+ def to_sql(formatter = nil)
+ build_query \
+ "INSERT",
+ "INTO #{table_sql}",
+ "(#{record.keys.collect { |key| engine.quote_column_name(key.name) }.join(', ')})",
+ "VALUES (#{record.collect { |key, value| key.format(value) }.join(', ')})"
+ end
+ end
+
+ class Update < Compound
+ def to_sql(formatter = nil)
+ build_query \
+ "UPDATE #{table_sql} SET",
+ assignment_sql,
+ ("WHERE #{wheres.collect(&:to_sql).join('\n\tAND ')}" unless wheres.blank? ),
+ ("LIMIT #{taken}" unless taken.blank? )
+ end
+
+ protected
+
+ def assignment_sql
+ assignments.collect do |attribute, value|
+ "#{engine.quote_column_name(attribute.name)} = #{attribute.format(value)}"
+ end.join(",\n")
+ end
+ end
+end