-
Notifications
You must be signed in to change notification settings - Fork 76
Expand file tree
/
Copy pathactive_record.rb
More file actions
74 lines (61 loc) · 2.15 KB
/
Copy pathactive_record.rb
File metadata and controls
74 lines (61 loc) · 2.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
require 'active_record'
module OrmAdapter
class ActiveRecord < Base
# Return list of column/property names
def column_names
klass.column_names
end
# @see OrmAdapter::Base#get!
def get!(id)
klass.find(wrap_key(id))
end
# @see OrmAdapter::Base#get
def get(id)
klass.where(klass.primary_key => wrap_key(id)).first
end
# @see OrmAdapter::Base#find_first
def find_first(options = {})
conditions, order = extract_conditions!(options)
klass.where(conditions_to_fields(conditions)).order(*order_clause(order)).first
end
# @see OrmAdapter::Base#find_all
def find_all(options = {})
conditions, order, limit, offset = extract_conditions!(options)
klass.where(conditions_to_fields(conditions)).order(*order_clause(order)).limit(limit).offset(offset).all
end
# @see OrmAdapter::Base#create!
def create!(attributes = {})
klass.create!(attributes)
end
# @see OrmAdapter::Base#destroy
def destroy(object)
object.destroy && true if valid_object?(object)
end
protected
# Introspects the klass to convert and objects in conditions into foreign key and type fields
def conditions_to_fields(conditions)
fields = {}
conditions.each do |key, value|
if value.is_a?(::ActiveRecord::Base) && (assoc = klass.reflect_on_association(key.to_sym)) && assoc.belongs_to?
if ::ActiveRecord::VERSION::STRING < "3.1"
fields[assoc.primary_key_name] = value.send(value.class.primary_key)
fields[assoc.options[:foreign_type]] = value.class.base_class.name.to_s if assoc.options[:polymorphic]
else # >= 3.1
fields[assoc.foreign_key] = value.send(value.class.primary_key)
fields[assoc.foreign_type] = value.class.base_class.name.to_s if assoc.options[:polymorphic]
end
else
fields[key] = value
end
end
fields
end
def order_clause(order)
order.map {|pair| "#{pair[0]} #{pair[1]}"}.join(",")
end
end
end
ActiveSupport.on_load(:active_record) do
extend ::OrmAdapter::ToAdapter
self::OrmAdapter = ::OrmAdapter::ActiveRecord
end