select_extra_columns 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.markdown +5 -2
- data/README.markdown +21 -6
- data/lib/select_extra_columns.rb +9 -11
- metadata +2 -2
data/CHANGELOG.markdown
CHANGED
data/README.markdown
CHANGED
@@ -60,18 +60,33 @@ Usage
|
|
60
60
|
users.first.street # returns the street
|
61
61
|
users.first.active # returns true/false
|
62
62
|
|
63
|
-
|
63
|
+
|
64
|
+
Dynamically added column fields are read only. Any value set to these fields are ignored during save.
|
65
|
+
|
66
|
+
user = User.first(:joins => :address, :select => "*, addresses.street as street",
|
67
|
+
:extra_columns => :street)
|
68
|
+
user.city # => "San Francisco"
|
69
|
+
...
|
70
|
+
user.city = "Houston" # change the value
|
71
|
+
user.save
|
72
|
+
|
73
|
+
user = User.first(:joins => :address, :select => "*, addresses.street as street",
|
74
|
+
:extra_columns => :street)
|
75
|
+
user.city # => "San Francisco"
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
### Input format for `:extra_columns`
|
64
80
|
|
65
81
|
Option accepts String/Symbol/Array/Hash as input.
|
66
82
|
|
67
|
-
Example:
|
68
83
|
|
69
|
-
|
84
|
+
#### String,Symbol format
|
70
85
|
:extra_columns => :first_name # Single string field: `first_name`(type is inferred as string)
|
71
86
|
|
72
87
|
:extra_columns => "first_name" # Single string field: `first_name`(type is inferred as string)
|
73
88
|
|
74
|
-
|
89
|
+
#### Hash format
|
75
90
|
:extra_columns => { # Two string fields and a boolean field
|
76
91
|
:first_name => :string,
|
77
92
|
:last_name => :string,
|
@@ -84,7 +99,7 @@ Example:
|
|
84
99
|
"has_flag" => :boolean
|
85
100
|
}
|
86
101
|
|
87
|
-
|
102
|
+
#### Array format
|
88
103
|
:extra_columns => [ # Two string fields and a boolean field
|
89
104
|
[:first_name, :string],
|
90
105
|
[:last_name, :string],
|
@@ -98,7 +113,7 @@ Example:
|
|
98
113
|
[:has_flag, :boolean]
|
99
114
|
]
|
100
115
|
|
101
|
-
### Valid data types
|
116
|
+
### Valid data types for column fields in `:extra_columns`
|
102
117
|
:binary
|
103
118
|
:boolean
|
104
119
|
:date
|
data/lib/select_extra_columns.rb
CHANGED
@@ -35,18 +35,16 @@ module SelectExtraColumns
|
|
35
35
|
def prepare_extra_column_klass extra_columns
|
36
36
|
extra_column_definitions = prepare_extra_column_definitions(extra_columns)
|
37
37
|
return self if extra_column_definitions.empty?
|
38
|
-
|
39
|
-
self.
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
end
|
38
|
+
read_only_attrs = extra_column_definitions.collect{|cd| ":#{cd.name}" }.join(",")
|
39
|
+
klass_name = "#{self.name}#{Time.now.to_i}#{extra_columns.hash.abs}"
|
40
|
+
class_eval(<<-RUBY, __FILE__, __LINE__)
|
41
|
+
class ::#{klass_name} < #{self.name}
|
42
|
+
set_table_name :#{self.table_name}
|
43
|
+
attr_readonly #{read_only_attrs}
|
44
|
+
class_inheritable_accessor :extra_columns
|
46
45
|
end
|
47
|
-
|
48
|
-
|
49
|
-
klass.instance_variable_set("@columns_hash", cols_hash.clone)
|
46
|
+
RUBY
|
47
|
+
klass_name.constantize.tap do |klass|
|
50
48
|
klass.extra_columns = extra_columns.is_a?(Symbol) ? extra_columns : extra_columns.clone
|
51
49
|
extra_column_definitions.each do |ecd|
|
52
50
|
klass.columns << (klass.columns_hash[ecd.name] = ecd)
|