Module: CompositePrimaryKeys::ActiveRecord::Base::CompositeClassMethods
- Defined in:
- lib/composite_primary_keys/base.rb
Instance Method Summary collapse
-
#columns ⇒ Object
Returns an array of column objects for the table associated with this class.
- #composite? ⇒ Boolean
-
#composite_where_clause(ids) ⇒ Object
Creates WHERE condition from list of composited ids User.update_all(=> ‘admin’, :conditions => composite_where_clause([[1, 2], [2, 2]])) #=> UPDATE admins SET admin.role=‘admin’ WHERE (admin.type=1 AND admin.type2=2) OR (admin.type=2 AND admin.type2=2) User.find(:all, :conditions => composite_where_clause([[1, 2], [2, 2]])) #=> SELECT * FROM admins WHERE (admin.type=1 AND admin.type2=2) OR (admin.type=2 AND admin.type2=2).
-
#delete(*ids) ⇒ Object
Deletes the record with the given
idswithout instantiating an object first, e.g. -
#destroy(*ids) ⇒ Object
Destroys the record with the given
idsby instantiating the object and calling #destroy (all the callbacks are the triggered). -
#exists?(ids) ⇒ Boolean
Returns true if the given
idsrepresents the primary keys of a record in the database, false otherwise. -
#ids_to_s(many_ids, id_sep = CompositePrimaryKeys::ID_SEP, list_sep = ',', left_bracket = '(', right_bracket = ')') ⇒ Object
ids_to_s([,[7,3]]) -> “(1,2),(7,3)” ids_to_s([,[7,3]], ‘,’, ‘;’) -> “1,2;7,3”.
- #primary_key ⇒ Object
- #primary_key=(keys) ⇒ Object
-
#reset_sequence_name ⇒ Object
:nodoc:.
-
#sequence_name ⇒ Object
Lazy-set the sequence name to the connection’s default.
- #set_primary_key(value = nil, &block) ⇒ Object
Instance Method Details
#columns ⇒ Object
Returns an array of column objects for the table associated with this class. Each column that matches to one of the primary keys has its primary attribute set to true
223 224 225 226 227 228 229 |
# File 'lib/composite_primary_keys/base.rb', line 223 def columns unless @columns @columns = connection.columns(table_name, "#{name} Columns") @columns.each {|column| column.primary = primary_keys.include?(column.name.to_sym)} end @columns end |
#composite? ⇒ Boolean
159 160 161 |
# File 'lib/composite_primary_keys/base.rb', line 159 def composite? true end |
#composite_where_clause(ids) ⇒ Object
Creates WHERE condition from list of composited ids
User.update_all({:role => 'admin'}, :conditions => composite_where_clause([[1, 2], [2, 2]])) #=> UPDATE admins SET admin.role='admin' WHERE (admin.type=1 AND admin.type2=2) OR (admin.type=2 AND admin.type2=2)
User.find(:all, :conditions => composite_where_clause([[1, 2], [2, 2]])) #=> SELECT * FROM admins WHERE (admin.type=1 AND admin.type2=2) OR (admin.type=2 AND admin.type2=2)
172 173 174 175 176 177 178 179 180 181 182 183 184 |
# File 'lib/composite_primary_keys/base.rb', line 172 def composite_where_clause(ids) if ids.is_a?(String) ids = [[ids]] elsif not ids.first.is_a?(Array) # if single comp key passed, turn into an array of 1 ids = [ids.to_composite_ids] end ids.map do |id_set| [primary_keys, id_set].transpose.map do |key, id| "#{table_name}.#{key.to_s}=#{sanitize(id)}" end.join(" AND ") end.join(") OR (") end |
#delete(*ids) ⇒ Object
Deletes the record with the given ids without instantiating an object first, e.g. delete(1,2) If an array of ids is provided (e.g. delete(, [3,4]), all of them are deleted.
197 198 199 200 201 202 203 204 205 206 |
# File 'lib/composite_primary_keys/base.rb', line 197 def delete(*ids) unless ids.is_a?(Array); raise "*ids must be an Array"; end ids = [ids.to_composite_ids] if not ids.first.is_a?(Array) where_clause = ids.map do |id_set| [primary_keys, id_set].transpose.map do |key, id| "#{quoted_table_name}.#{connection.quote_column_name(key.to_s)}=#{sanitize(id)}" end.join(" AND ") end.join(") OR (") delete_all([ "(#{where_clause})" ]) end |
#destroy(*ids) ⇒ Object
Destroys the record with the given ids by instantiating the object and calling #destroy (all the callbacks are the triggered). If an array of ids is provided, all of them are destroyed.
210 211 212 213 214 215 216 217 218 |
# File 'lib/composite_primary_keys/base.rb', line 210 def destroy(*ids) unless ids.is_a?(Array); raise "*ids must be an Array"; end if ids.first.is_a?(Array) ids = ids.map{|compids| compids.to_composite_ids} else ids = ids.to_composite_ids end ids.first.is_a?(CompositeIds) ? ids.each { |id_set| find(id_set).destroy } : find(ids).destroy end |
#exists?(ids) ⇒ Boolean
Returns true if the given ids represents the primary keys of a record in the database, false otherwise. Example:
Person.exists?(5,7)
189 190 191 192 |
# File 'lib/composite_primary_keys/base.rb', line 189 def exists?(ids) obj = find(ids) rescue false !obj.nil? and obj.is_a?(self) end |
#ids_to_s(many_ids, id_sep = CompositePrimaryKeys::ID_SEP, list_sep = ',', left_bracket = '(', right_bracket = ')') ⇒ Object
ids_to_s([,[7,3]]) -> “(1,2),(7,3)” ids_to_s([,[7,3]], ‘,’, ‘;’) -> “1,2;7,3”
165 166 167 |
# File 'lib/composite_primary_keys/base.rb', line 165 def ids_to_s(many_ids, id_sep = CompositePrimaryKeys::ID_SEP, list_sep = ',', left_bracket = '(', right_bracket = ')') many_ids.map {|ids| "#{left_bracket}#{ids}#{right_bracket}"}.join(list_sep) end |
#primary_key ⇒ Object
156 |
# File 'lib/composite_primary_keys/base.rb', line 156 def primary_key; primary_keys; end |
#primary_key=(keys) ⇒ Object
157 |
# File 'lib/composite_primary_keys/base.rb', line 157 def primary_key=(keys); primary_keys = keys; end |
#reset_sequence_name ⇒ Object
:nodoc:
239 240 241 |
# File 'lib/composite_primary_keys/base.rb', line 239 def reset_sequence_name #:nodoc: raise CompositeKeyError, CompositePrimaryKeys::ActiveRecord::Base::INVALID_FOR_COMPOSITE_KEYS end |
#sequence_name ⇒ Object
Lazy-set the sequence name to the connection’s default. This method is only ever called once since set_sequence_name overrides it.
235 236 237 |
# File 'lib/composite_primary_keys/base.rb', line 235 def sequence_name #:nodoc: raise CompositeKeyError, CompositePrimaryKeys::ActiveRecord::Base::INVALID_FOR_COMPOSITE_KEYS end |
#set_primary_key(value = nil, &block) ⇒ Object
243 244 245 |
# File 'lib/composite_primary_keys/base.rb', line 243 def set_primary_key(value = nil, &block) raise CompositeKeyError, CompositePrimaryKeys::ActiveRecord::Base::INVALID_FOR_COMPOSITE_KEYS end |