seeder 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. data/lib/seeder.rb +20 -4
  2. data/lib/seeder/version.rb +1 -1
  3. metadata +5 -5
data/lib/seeder.rb CHANGED
@@ -1,6 +1,10 @@
1
1
  class Seeder
2
2
 
3
3
  class << self
4
+ QUOTING = {
5
+ "ActiveRecord::ConnectionAdapters::MysqlAdapter" => "`",
6
+ "ActiveRecord::ConnectionAdapters::Mysql2Adapter" => "`"
7
+ }
4
8
 
5
9
  def existing_data_keys(ar_model)
6
10
  keys = @primary_keys[ar_model.name]
@@ -25,17 +29,29 @@ class Seeder
25
29
  end
26
30
  end
27
31
 
32
+ def quote(value)
33
+ q = QUOTING[ActiveRecord::Base.connection.class.to_s] || "'"
34
+ "#{q}#{value}#{q}"
35
+ end
36
+
28
37
  def add_new_or_changed_data(ar_model)
29
38
  keys = @primary_keys[ar_model.name]
30
39
  find_method = "find_by_#{keys.join('_and_')}"
40
+
31
41
  @data[ar_model.name].collect do |attributes|
32
42
  relevant_keys = attributes.keys & ar_model.column_names.map(&:to_sym)
33
43
  existing = ar_model.send(find_method, *attributes.values_at(*keys))
34
- next if existing && attributes.values_at(*relevant_keys) == existing.attributes.symbolize_keys.values_at(*relevant_keys)
35
44
  values = attributes.values_at(*relevant_keys)
36
- %{
37
- INSERT INTO #{ar_model.table_name} (#{relevant_keys.map{|col| "`#{col}`"}.join(', ')}) VALUES (#{values.map{|val| value_to_sql(val)}.join(', ')}) ON DUPLICATE KEY UPDATE #{relevant_keys.map{|col| "`#{col}` = VALUES(`#{col}`)"}.join(', ')}
38
- }
45
+
46
+ if existing
47
+ updates = attributes.slice(*relevant_keys).map { |k,v| "#{quote(k)} = #{value_to_sql(v)}" }.join(", ")
48
+ conditions = keys.map { |k| "#{quote(k)} = #{value_to_sql(existing.send(k))}" }.join(" AND ")
49
+ %(UPDATE #{ar_model.table_name} SET #{updates} WHERE #{conditions})
50
+ else
51
+ columns = relevant_keys.join(", ")
52
+ inserts = attributes.slice(*relevant_keys).values.map { |v| value_to_sql(v) }.join(", ")
53
+ %(INSERT INTO #{ar_model.table_name} (#{columns}) VALUES (#{inserts}))
54
+ end
39
55
  end.compact
40
56
  end
41
57
 
@@ -1,3 +1,3 @@
1
1
  class Seeder
2
- VERSION = '0.1.0'
2
+ VERSION = '0.1.1'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: seeder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2011-09-02 00:00:00.000000000Z
13
+ date: 2011-09-16 00:00:00.000000000Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rspec
17
- requirement: &2152871700 !ruby/object:Gem::Requirement
17
+ requirement: &2166523000 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ~>
@@ -22,7 +22,7 @@ dependencies:
22
22
  version: 2.6.0
23
23
  type: :development
24
24
  prerelease: false
25
- version_requirements: *2152871700
25
+ version_requirements: *2166523000
26
26
  description: Keep your app's seed data in one file and update it easily, while respecting
27
27
  key constraints
28
28
  email: bsingh@wegowise.com
@@ -60,7 +60,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
60
60
  version: 1.3.6
61
61
  requirements: []
62
62
  rubyforge_project:
63
- rubygems_version: 1.8.6
63
+ rubygems_version: 1.8.10
64
64
  signing_key:
65
65
  specification_version: 3
66
66
  summary: Seed your data