activerecord 1.0.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of activerecord might be problematic. Click here for more details.
- data/CHANGELOG +4928 -3
- data/README +45 -46
- data/RUNNING_UNIT_TESTS +8 -11
- data/Rakefile +247 -0
- data/install.rb +8 -38
- data/lib/active_record/aggregations.rb +64 -49
- data/lib/active_record/associations/association_collection.rb +217 -47
- data/lib/active_record/associations/association_proxy.rb +159 -0
- data/lib/active_record/associations/belongs_to_association.rb +56 -0
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +50 -0
- data/lib/active_record/associations/has_and_belongs_to_many_association.rb +155 -37
- data/lib/active_record/associations/has_many_association.rb +145 -75
- data/lib/active_record/associations/has_many_through_association.rb +283 -0
- data/lib/active_record/associations/has_one_association.rb +96 -0
- data/lib/active_record/associations.rb +1537 -304
- data/lib/active_record/attribute_methods.rb +328 -0
- data/lib/active_record/base.rb +2001 -588
- data/lib/active_record/calculations.rb +269 -0
- data/lib/active_record/callbacks.rb +169 -165
- data/lib/active_record/connection_adapters/abstract/connection_specification.rb +308 -0
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +171 -0
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +87 -0
- data/lib/active_record/connection_adapters/abstract/quoting.rb +69 -0
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +472 -0
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +306 -0
- data/lib/active_record/connection_adapters/abstract_adapter.rb +125 -279
- data/lib/active_record/connection_adapters/mysql_adapter.rb +442 -77
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +805 -135
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +34 -0
- data/lib/active_record/connection_adapters/sqlite_adapter.rb +353 -69
- data/lib/active_record/fixtures.rb +946 -100
- data/lib/active_record/locking/optimistic.rb +144 -0
- data/lib/active_record/locking/pessimistic.rb +77 -0
- data/lib/active_record/migration.rb +417 -0
- data/lib/active_record/observer.rb +142 -32
- data/lib/active_record/query_cache.rb +23 -0
- data/lib/active_record/reflection.rb +163 -70
- data/lib/active_record/schema.rb +58 -0
- data/lib/active_record/schema_dumper.rb +171 -0
- data/lib/active_record/serialization.rb +98 -0
- data/lib/active_record/serializers/json_serializer.rb +71 -0
- data/lib/active_record/serializers/xml_serializer.rb +315 -0
- data/lib/active_record/timestamp.rb +41 -0
- data/lib/active_record/transactions.rb +87 -57
- data/lib/active_record/validations.rb +909 -122
- data/lib/active_record/vendor/db2.rb +362 -0
- data/lib/active_record/vendor/mysql.rb +126 -29
- data/lib/active_record/version.rb +9 -0
- data/lib/active_record.rb +35 -7
- data/lib/activerecord.rb +1 -0
- data/test/aaa_create_tables_test.rb +72 -0
- data/test/abstract_unit.rb +73 -5
- data/test/active_schema_test_mysql.rb +43 -0
- data/test/adapter_test.rb +105 -0
- data/test/adapter_test_sqlserver.rb +95 -0
- data/test/aggregations_test.rb +110 -16
- data/test/all.sh +2 -2
- data/test/ar_schema_test.rb +33 -0
- data/test/association_inheritance_reload.rb +14 -0
- data/test/associations/ar_joins_test.rb +0 -0
- data/test/associations/callbacks_test.rb +147 -0
- data/test/associations/cascaded_eager_loading_test.rb +110 -0
- data/test/associations/eager_singularization_test.rb +145 -0
- data/test/associations/eager_test.rb +442 -0
- data/test/associations/extension_test.rb +47 -0
- data/test/associations/inner_join_association_test.rb +88 -0
- data/test/associations/join_model_test.rb +553 -0
- data/test/associations_test.rb +1930 -267
- data/test/attribute_methods_test.rb +146 -0
- data/test/base_test.rb +1316 -84
- data/test/binary_test.rb +32 -0
- data/test/calculations_test.rb +251 -0
- data/test/callbacks_test.rb +400 -0
- data/test/class_inheritable_attributes_test.rb +3 -4
- data/test/column_alias_test.rb +17 -0
- data/test/connection_test_firebird.rb +8 -0
- data/test/connection_test_mysql.rb +30 -0
- data/test/connections/native_db2/connection.rb +25 -0
- data/test/connections/native_firebird/connection.rb +26 -0
- data/test/connections/native_frontbase/connection.rb +27 -0
- data/test/connections/native_mysql/connection.rb +21 -18
- data/test/connections/native_openbase/connection.rb +21 -0
- data/test/connections/native_oracle/connection.rb +27 -0
- data/test/connections/native_postgresql/connection.rb +17 -18
- data/test/connections/native_sqlite/connection.rb +17 -16
- data/test/connections/native_sqlite3/connection.rb +25 -0
- data/test/connections/native_sqlite3/in_memory_connection.rb +18 -0
- data/test/connections/native_sybase/connection.rb +23 -0
- data/test/copy_table_test_sqlite.rb +69 -0
- data/test/datatype_test_postgresql.rb +203 -0
- data/test/date_time_test.rb +37 -0
- data/test/default_test_firebird.rb +16 -0
- data/test/defaults_test.rb +67 -0
- data/test/deprecated_finder_test.rb +30 -0
- data/test/finder_test.rb +607 -32
- data/test/fixtures/accounts.yml +28 -0
- data/test/fixtures/all/developers.yml +0 -0
- data/test/fixtures/all/people.csv +0 -0
- data/test/fixtures/all/tasks.yml +0 -0
- data/test/fixtures/author.rb +107 -0
- data/test/fixtures/author_favorites.yml +4 -0
- data/test/fixtures/authors.yml +7 -0
- data/test/fixtures/bad_fixtures/attr_with_numeric_first_char +1 -0
- data/test/fixtures/bad_fixtures/attr_with_spaces +1 -0
- data/test/fixtures/bad_fixtures/blank_line +3 -0
- data/test/fixtures/bad_fixtures/duplicate_attributes +3 -0
- data/test/fixtures/bad_fixtures/missing_value +1 -0
- data/test/fixtures/binaries.yml +132 -0
- data/test/fixtures/binary.rb +2 -0
- data/test/fixtures/book.rb +4 -0
- data/test/fixtures/books.yml +7 -0
- data/test/fixtures/categories/special_categories.yml +9 -0
- data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -0
- data/test/fixtures/categories.yml +14 -0
- data/test/fixtures/categories_ordered.yml +7 -0
- data/test/fixtures/categories_posts.yml +23 -0
- data/test/fixtures/categorization.rb +5 -0
- data/test/fixtures/categorizations.yml +17 -0
- data/test/fixtures/category.rb +26 -0
- data/test/fixtures/citation.rb +6 -0
- data/test/fixtures/comment.rb +23 -0
- data/test/fixtures/comments.yml +59 -0
- data/test/fixtures/companies.yml +55 -0
- data/test/fixtures/company.rb +81 -4
- data/test/fixtures/company_in_module.rb +32 -6
- data/test/fixtures/computer.rb +4 -0
- data/test/fixtures/computers.yml +4 -0
- data/test/fixtures/contact.rb +16 -0
- data/test/fixtures/courses.yml +7 -0
- data/test/fixtures/customer.rb +28 -3
- data/test/fixtures/customers.yml +17 -0
- data/test/fixtures/db_definitions/db2.drop.sql +33 -0
- data/test/fixtures/db_definitions/db2.sql +235 -0
- data/test/fixtures/db_definitions/db22.drop.sql +2 -0
- data/test/fixtures/db_definitions/db22.sql +5 -0
- data/test/fixtures/db_definitions/firebird.drop.sql +65 -0
- data/test/fixtures/db_definitions/firebird.sql +310 -0
- data/test/fixtures/db_definitions/firebird2.drop.sql +2 -0
- data/test/fixtures/db_definitions/firebird2.sql +6 -0
- data/test/fixtures/db_definitions/frontbase.drop.sql +33 -0
- data/test/fixtures/db_definitions/frontbase.sql +273 -0
- data/test/fixtures/db_definitions/frontbase2.drop.sql +1 -0
- data/test/fixtures/db_definitions/frontbase2.sql +4 -0
- data/test/fixtures/db_definitions/openbase.drop.sql +2 -0
- data/test/fixtures/db_definitions/openbase.sql +318 -0
- data/test/fixtures/db_definitions/openbase2.drop.sql +2 -0
- data/test/fixtures/db_definitions/openbase2.sql +7 -0
- data/test/fixtures/db_definitions/oracle.drop.sql +67 -0
- data/test/fixtures/db_definitions/oracle.sql +330 -0
- data/test/fixtures/db_definitions/oracle2.drop.sql +2 -0
- data/test/fixtures/db_definitions/oracle2.sql +6 -0
- data/test/fixtures/db_definitions/postgresql.drop.sql +44 -0
- data/test/fixtures/db_definitions/postgresql.sql +217 -38
- data/test/fixtures/db_definitions/postgresql2.drop.sql +2 -0
- data/test/fixtures/db_definitions/postgresql2.sql +2 -2
- data/test/fixtures/db_definitions/schema.rb +354 -0
- data/test/fixtures/db_definitions/schema2.rb +11 -0
- data/test/fixtures/db_definitions/sqlite.drop.sql +33 -0
- data/test/fixtures/db_definitions/sqlite.sql +139 -5
- data/test/fixtures/db_definitions/sqlite2.drop.sql +2 -0
- data/test/fixtures/db_definitions/sqlite2.sql +1 -0
- data/test/fixtures/db_definitions/sybase.drop.sql +35 -0
- data/test/fixtures/db_definitions/sybase.sql +222 -0
- data/test/fixtures/db_definitions/sybase2.drop.sql +4 -0
- data/test/fixtures/db_definitions/sybase2.sql +5 -0
- data/test/fixtures/developer.rb +70 -6
- data/test/fixtures/developers.yml +21 -0
- data/test/fixtures/developers_projects/david_action_controller +2 -1
- data/test/fixtures/developers_projects/david_active_record +2 -1
- data/test/fixtures/developers_projects.yml +17 -0
- data/test/fixtures/edge.rb +5 -0
- data/test/fixtures/edges.yml +6 -0
- data/test/fixtures/entrants.yml +14 -0
- data/test/fixtures/example.log +1 -0
- data/test/fixtures/fk_test_has_fk.yml +3 -0
- data/test/fixtures/fk_test_has_pk.yml +2 -0
- data/test/fixtures/flowers.jpg +0 -0
- data/test/fixtures/funny_jokes.yml +10 -0
- data/test/fixtures/item.rb +7 -0
- data/test/fixtures/items.yml +4 -0
- data/test/fixtures/joke.rb +3 -0
- data/test/fixtures/keyboard.rb +3 -0
- data/test/fixtures/legacy_thing.rb +3 -0
- data/test/fixtures/legacy_things.yml +3 -0
- data/test/fixtures/matey.rb +4 -0
- data/test/fixtures/mateys.yml +4 -0
- data/test/fixtures/migrations/1_people_have_last_names.rb +9 -0
- data/test/fixtures/migrations/2_we_need_reminders.rb +12 -0
- data/test/fixtures/migrations/3_innocent_jointable.rb +12 -0
- data/test/fixtures/migrations_with_decimal/1_give_me_big_numbers.rb +15 -0
- data/test/fixtures/migrations_with_duplicate/1_people_have_last_names.rb +9 -0
- data/test/fixtures/migrations_with_duplicate/2_we_need_reminders.rb +12 -0
- data/test/fixtures/migrations_with_duplicate/3_foo.rb +7 -0
- data/test/fixtures/migrations_with_duplicate/3_innocent_jointable.rb +12 -0
- data/test/fixtures/migrations_with_missing_versions/1000_people_have_middle_names.rb +9 -0
- data/test/fixtures/migrations_with_missing_versions/1_people_have_last_names.rb +9 -0
- data/test/fixtures/migrations_with_missing_versions/3_we_need_reminders.rb +12 -0
- data/test/fixtures/migrations_with_missing_versions/4_innocent_jointable.rb +12 -0
- data/test/fixtures/minimalistic.rb +2 -0
- data/test/fixtures/minimalistics.yml +2 -0
- data/test/fixtures/mixed_case_monkey.rb +3 -0
- data/test/fixtures/mixed_case_monkeys.yml +6 -0
- data/test/fixtures/mixins.yml +29 -0
- data/test/fixtures/movies.yml +7 -0
- data/test/fixtures/naked/csv/accounts.csv +1 -0
- data/test/fixtures/naked/yml/accounts.yml +1 -0
- data/test/fixtures/naked/yml/companies.yml +1 -0
- data/test/fixtures/naked/yml/courses.yml +1 -0
- data/test/fixtures/order.rb +4 -0
- data/test/fixtures/parrot.rb +13 -0
- data/test/fixtures/parrots.yml +27 -0
- data/test/fixtures/parrots_pirates.yml +7 -0
- data/test/fixtures/people.yml +3 -0
- data/test/fixtures/person.rb +4 -0
- data/test/fixtures/pirate.rb +5 -0
- data/test/fixtures/pirates.yml +9 -0
- data/test/fixtures/post.rb +59 -0
- data/test/fixtures/posts.yml +48 -0
- data/test/fixtures/project.rb +27 -2
- data/test/fixtures/projects.yml +7 -0
- data/test/fixtures/reader.rb +4 -0
- data/test/fixtures/readers.yml +4 -0
- data/test/fixtures/reply.rb +18 -2
- data/test/fixtures/reserved_words/distinct.yml +5 -0
- data/test/fixtures/reserved_words/distincts_selects.yml +11 -0
- data/test/fixtures/reserved_words/group.yml +14 -0
- data/test/fixtures/reserved_words/select.yml +8 -0
- data/test/fixtures/reserved_words/values.yml +7 -0
- data/test/fixtures/ship.rb +3 -0
- data/test/fixtures/ships.yml +5 -0
- data/test/fixtures/subject.rb +4 -0
- data/test/fixtures/subscriber.rb +4 -3
- data/test/fixtures/tag.rb +7 -0
- data/test/fixtures/tagging.rb +10 -0
- data/test/fixtures/taggings.yml +25 -0
- data/test/fixtures/tags.yml +7 -0
- data/test/fixtures/task.rb +3 -0
- data/test/fixtures/tasks.yml +7 -0
- data/test/fixtures/topic.rb +20 -3
- data/test/fixtures/topics.yml +22 -0
- data/test/fixtures/treasure.rb +4 -0
- data/test/fixtures/treasures.yml +10 -0
- data/test/fixtures/vertex.rb +9 -0
- data/test/fixtures/vertices.yml +4 -0
- data/test/fixtures_test.rb +574 -8
- data/test/inheritance_test.rb +113 -27
- data/test/json_serialization_test.rb +180 -0
- data/test/lifecycle_test.rb +56 -29
- data/test/locking_test.rb +273 -0
- data/test/method_scoping_test.rb +416 -0
- data/test/migration_test.rb +933 -0
- data/test/migration_test_firebird.rb +124 -0
- data/test/mixin_test.rb +95 -0
- data/test/modules_test.rb +23 -10
- data/test/multiple_db_test.rb +17 -3
- data/test/pk_test.rb +59 -15
- data/test/query_cache_test.rb +104 -0
- data/test/readonly_test.rb +107 -0
- data/test/reflection_test.rb +124 -27
- data/test/reserved_word_test_mysql.rb +177 -0
- data/test/schema_authorization_test_postgresql.rb +75 -0
- data/test/schema_dumper_test.rb +131 -0
- data/test/schema_test_postgresql.rb +64 -0
- data/test/serialization_test.rb +47 -0
- data/test/synonym_test_oracle.rb +17 -0
- data/test/table_name_test_sqlserver.rb +23 -0
- data/test/threaded_connections_test.rb +48 -0
- data/test/transactions_test.rb +227 -29
- data/test/unconnected_test.rb +14 -6
- data/test/validations_test.rb +1293 -32
- data/test/xml_serialization_test.rb +202 -0
- metadata +347 -143
- data/dev-utils/eval_debugger.rb +0 -9
- data/examples/associations.rb +0 -87
- data/examples/shared_setup.rb +0 -15
- data/examples/validation.rb +0 -88
- data/lib/active_record/deprecated_associations.rb +0 -70
- data/lib/active_record/support/class_attribute_accessors.rb +0 -43
- data/lib/active_record/support/class_inheritable_attributes.rb +0 -37
- data/lib/active_record/support/clean_logger.rb +0 -10
- data/lib/active_record/support/inflector.rb +0 -70
- data/lib/active_record/vendor/simple.rb +0 -702
- data/lib/active_record/wrappers/yaml_wrapper.rb +0 -15
- data/lib/active_record/wrappings.rb +0 -59
- data/rakefile +0 -122
- data/test/deprecated_associations_test.rb +0 -336
- data/test/fixtures/accounts/signals37 +0 -3
- data/test/fixtures/accounts/unknown +0 -2
- data/test/fixtures/companies/first_client +0 -6
- data/test/fixtures/companies/first_firm +0 -4
- data/test/fixtures/companies/second_client +0 -6
- data/test/fixtures/courses/java +0 -2
- data/test/fixtures/courses/ruby +0 -2
- data/test/fixtures/customers/david +0 -6
- data/test/fixtures/db_definitions/mysql.sql +0 -96
- data/test/fixtures/db_definitions/mysql2.sql +0 -4
- data/test/fixtures/developers/david +0 -2
- data/test/fixtures/developers/jamis +0 -2
- data/test/fixtures/entrants/first +0 -3
- data/test/fixtures/entrants/second +0 -3
- data/test/fixtures/entrants/third +0 -3
- data/test/fixtures/fixture_database.sqlite +0 -0
- data/test/fixtures/fixture_database_2.sqlite +0 -0
- data/test/fixtures/movies/first +0 -2
- data/test/fixtures/movies/second +0 -2
- data/test/fixtures/projects/action_controller +0 -2
- data/test/fixtures/projects/active_record +0 -2
- data/test/fixtures/topics/first +0 -9
- data/test/fixtures/topics/second +0 -8
- data/test/inflector_test.rb +0 -104
- data/test/thread_safety_test.rb +0 -33
data/examples/validation.rb
DELETED
@@ -1,88 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/shared_setup'
|
2
|
-
|
3
|
-
logger = Logger.new(STDOUT)
|
4
|
-
|
5
|
-
# Database setup ---------------
|
6
|
-
|
7
|
-
logger.info "\nCreate tables"
|
8
|
-
|
9
|
-
[ "DROP TABLE people",
|
10
|
-
"CREATE TABLE people (id int(11) auto_increment, name varchar(100), pass varchar(100), email varchar(100), PRIMARY KEY (id))"
|
11
|
-
].each { |statement|
|
12
|
-
begin; ActiveRecord::Base.connection.execute(statement); rescue ActiveRecord::StatementInvalid; end # Tables doesn't necessarily already exist
|
13
|
-
}
|
14
|
-
|
15
|
-
|
16
|
-
# Class setup ---------------
|
17
|
-
|
18
|
-
class Person < ActiveRecord::Base
|
19
|
-
# Active Record can only guess simple table names like Card/cards, Company/companies
|
20
|
-
def self.table_name() "people" end
|
21
|
-
|
22
|
-
# Using
|
23
|
-
def self.authenticate(name, pass)
|
24
|
-
# find_first "name = '#{name}' AND pass = '#{pass}'" would be open to sql-injection (in a web-app scenario)
|
25
|
-
find_first [ "name = '%s' AND pass = '%s'", name, pass ]
|
26
|
-
end
|
27
|
-
|
28
|
-
def self.name_exists?(name, id = nil)
|
29
|
-
if id.nil?
|
30
|
-
condition = [ "name = '%s'", name ]
|
31
|
-
else
|
32
|
-
# Check if anyone else than the person identified by person_id has that user_name
|
33
|
-
condition = [ "name = '%s' AND id <> %d", name, id ]
|
34
|
-
end
|
35
|
-
|
36
|
-
!find_first(condition).nil?
|
37
|
-
end
|
38
|
-
|
39
|
-
def email_address_with_name
|
40
|
-
"\"#{name}\" <#{email}>"
|
41
|
-
end
|
42
|
-
|
43
|
-
protected
|
44
|
-
def validate
|
45
|
-
errors.add_on_empty(%w(name pass email))
|
46
|
-
errors.add("email", "must be valid") unless email_address_valid?
|
47
|
-
end
|
48
|
-
|
49
|
-
def validate_on_create
|
50
|
-
if attribute_present?("name") && Person.name_exists?(name)
|
51
|
-
errors.add("name", "is already taken by another person")
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def validate_on_update
|
56
|
-
if attribute_present?("name") && Person.name_exists?(name, id)
|
57
|
-
errors.add("name", "is already taken by another person")
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
private
|
62
|
-
def email_address_valid?() email =~ /\w[-.\w]*\@[-\w]+[-.\w]*\.\w+/ end
|
63
|
-
end
|
64
|
-
|
65
|
-
# Usage ---------------
|
66
|
-
|
67
|
-
logger.info "\nCreate fixtures"
|
68
|
-
david = Person.new("name" => "David Heinemeier Hansson", "pass" => "", "email" => "")
|
69
|
-
unless david.save
|
70
|
-
puts "There was #{david.errors.count} error(s)"
|
71
|
-
david.errors.each_full { |error| puts error }
|
72
|
-
end
|
73
|
-
|
74
|
-
david.pass = "something"
|
75
|
-
david.email = "invalid_address"
|
76
|
-
unless david.save
|
77
|
-
puts "There was #{david.errors.count} error(s)"
|
78
|
-
puts "It was email with: " + david.errors.on("email")
|
79
|
-
end
|
80
|
-
|
81
|
-
david.email = "david@loudthinking.com"
|
82
|
-
if david.save then puts "David finally made it!" end
|
83
|
-
|
84
|
-
|
85
|
-
another_david = Person.new("name" => "David Heinemeier Hansson", "pass" => "xc", "email" => "david@loudthinking")
|
86
|
-
unless another_david.save
|
87
|
-
puts "Error on name: " + another_david.errors.on("name")
|
88
|
-
end
|
@@ -1,70 +0,0 @@
|
|
1
|
-
module ActiveRecord
|
2
|
-
module Associations # :nodoc:
|
3
|
-
module ClassMethods
|
4
|
-
def deprecated_collection_count_method(collection_name)# :nodoc:
|
5
|
-
module_eval <<-"end_eval", __FILE__, __LINE__
|
6
|
-
def #{collection_name}_count(force_reload = false)
|
7
|
-
#{collection_name}.reload if force_reload
|
8
|
-
#{collection_name}.size
|
9
|
-
end
|
10
|
-
end_eval
|
11
|
-
end
|
12
|
-
|
13
|
-
def deprecated_add_association_relation(association_name)# :nodoc:
|
14
|
-
module_eval <<-"end_eval", __FILE__, __LINE__
|
15
|
-
def add_#{association_name}(*items)
|
16
|
-
#{association_name}.concat(items)
|
17
|
-
end
|
18
|
-
end_eval
|
19
|
-
end
|
20
|
-
|
21
|
-
def deprecated_remove_association_relation(association_name)# :nodoc:
|
22
|
-
module_eval <<-"end_eval", __FILE__, __LINE__
|
23
|
-
def remove_#{association_name}(items)
|
24
|
-
#{association_name}.delete(items)
|
25
|
-
end
|
26
|
-
end_eval
|
27
|
-
end
|
28
|
-
|
29
|
-
def deprecated_has_collection_method(collection_name)# :nodoc:
|
30
|
-
module_eval <<-"end_eval", __FILE__, __LINE__
|
31
|
-
def has_#{collection_name}?(force_reload = false)
|
32
|
-
!#{collection_name}(force_reload).empty?
|
33
|
-
end
|
34
|
-
end_eval
|
35
|
-
end
|
36
|
-
|
37
|
-
def deprecated_find_in_collection_method(collection_name)# :nodoc:
|
38
|
-
module_eval <<-"end_eval", __FILE__, __LINE__
|
39
|
-
def find_in_#{collection_name}(association_id)
|
40
|
-
#{collection_name}.find(association_id)
|
41
|
-
end
|
42
|
-
end_eval
|
43
|
-
end
|
44
|
-
|
45
|
-
def deprecated_find_all_in_collection_method(collection_name)# :nodoc:
|
46
|
-
module_eval <<-"end_eval", __FILE__, __LINE__
|
47
|
-
def find_all_in_#{collection_name}(runtime_conditions = nil, orderings = nil, limit = nil, joins = nil)
|
48
|
-
#{collection_name}.find_all(runtime_conditions, orderings, limit, joins)
|
49
|
-
end
|
50
|
-
end_eval
|
51
|
-
end
|
52
|
-
|
53
|
-
def deprecated_create_method(collection_name)# :nodoc:
|
54
|
-
module_eval <<-"end_eval", __FILE__, __LINE__
|
55
|
-
def create_in_#{collection_name}(attributes = {})
|
56
|
-
#{collection_name}.create(attributes)
|
57
|
-
end
|
58
|
-
end_eval
|
59
|
-
end
|
60
|
-
|
61
|
-
def deprecated_build_method(collection_name)# :nodoc:
|
62
|
-
module_eval <<-"end_eval", __FILE__, __LINE__
|
63
|
-
def build_to_#{collection_name}(attributes = {})
|
64
|
-
#{collection_name}.build(attributes)
|
65
|
-
end
|
66
|
-
end_eval
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
@@ -1,43 +0,0 @@
|
|
1
|
-
# attr_* style accessors for class-variables that can accessed both on an instance and class level.
|
2
|
-
class Class #:nodoc:
|
3
|
-
def cattr_reader(*syms)
|
4
|
-
syms.each do |sym|
|
5
|
-
class_eval <<-EOS
|
6
|
-
if ! defined? @@#{sym.id2name}
|
7
|
-
@@#{sym.id2name} = nil
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.#{sym.id2name}
|
11
|
-
@@#{sym}
|
12
|
-
end
|
13
|
-
|
14
|
-
def #{sym.id2name}
|
15
|
-
self.class.#{sym.id2name}
|
16
|
-
end
|
17
|
-
EOS
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def cattr_writer(*syms)
|
22
|
-
syms.each do |sym|
|
23
|
-
class_eval <<-EOS
|
24
|
-
if ! defined? @@#{sym.id2name}
|
25
|
-
@@#{sym.id2name} = nil
|
26
|
-
end
|
27
|
-
|
28
|
-
def self.#{sym.id2name}=(obj)
|
29
|
-
@@#{sym.id2name} = obj
|
30
|
-
end
|
31
|
-
|
32
|
-
def #{sym.id2name}=(obj)
|
33
|
-
self.class.#{sym.id2name}=(obj)
|
34
|
-
end
|
35
|
-
EOS
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def cattr_accessor(*syms)
|
40
|
-
cattr_reader(*syms)
|
41
|
-
cattr_writer(*syms)
|
42
|
-
end
|
43
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
# Allows attributes to be shared within an inheritance hierarchy, but where each descentent gets a copy of
|
2
|
-
# their parents' attributes, instead of just a pointer to the same. This means that the child can add elements
|
3
|
-
# to, for example, an array without those additions being shared with either their parent, siblings, or
|
4
|
-
# children, which is unlike the regular class-level attributes that are shared across the entire hierarchy.
|
5
|
-
module ClassInheritableAttributes # :nodoc:
|
6
|
-
def self.append_features(base)
|
7
|
-
super
|
8
|
-
base.extend(ClassMethods)
|
9
|
-
end
|
10
|
-
|
11
|
-
module ClassMethods # :nodoc:
|
12
|
-
@@classes ||= {}
|
13
|
-
|
14
|
-
def inheritable_attributes
|
15
|
-
@@classes[self] ||= {}
|
16
|
-
end
|
17
|
-
|
18
|
-
def write_inheritable_attribute(key, value)
|
19
|
-
inheritable_attributes[key] = value
|
20
|
-
end
|
21
|
-
|
22
|
-
def write_inheritable_array(key, elements)
|
23
|
-
write_inheritable_attribute(key, []) if read_inheritable_attribute(key).nil?
|
24
|
-
write_inheritable_attribute(key, read_inheritable_attribute(key) + elements)
|
25
|
-
end
|
26
|
-
|
27
|
-
def read_inheritable_attribute(key)
|
28
|
-
inheritable_attributes[key]
|
29
|
-
end
|
30
|
-
|
31
|
-
private
|
32
|
-
def inherited(child)
|
33
|
-
@@classes[child] = inheritable_attributes.dup
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|
37
|
-
end
|
@@ -1,70 +0,0 @@
|
|
1
|
-
# The Inflector transforms words from singular to plural, class names to table names, modulized class names to ones without,
|
2
|
-
# and class names to foreign keys.
|
3
|
-
module Inflector
|
4
|
-
extend self
|
5
|
-
|
6
|
-
def pluralize(word)
|
7
|
-
result = word.dup
|
8
|
-
plural_rules.each do |(rule, replacement)|
|
9
|
-
break if result.gsub!(rule, replacement)
|
10
|
-
end
|
11
|
-
return result
|
12
|
-
end
|
13
|
-
|
14
|
-
def singularize(word)
|
15
|
-
result = word.dup
|
16
|
-
singular_rules.each do |(rule, replacement)|
|
17
|
-
break if result.gsub!(rule, replacement)
|
18
|
-
end
|
19
|
-
return result
|
20
|
-
end
|
21
|
-
|
22
|
-
def camelize(lower_case_and_underscored_word)
|
23
|
-
lower_case_and_underscored_word.gsub(/(^|_)(.)/){$2.upcase}
|
24
|
-
end
|
25
|
-
|
26
|
-
def underscore(camel_cased_word)
|
27
|
-
camel_cased_word.gsub(/([A-Z]+)([A-Z])/,'\1_\2').gsub(/([a-z])([A-Z])/,'\1_\2').downcase
|
28
|
-
end
|
29
|
-
|
30
|
-
def demodulize(class_name_in_module)
|
31
|
-
class_name_in_module.gsub(/^.*::/, '')
|
32
|
-
end
|
33
|
-
|
34
|
-
def foreign_key(class_name, separate_class_name_and_id_with_underscore = true)
|
35
|
-
Inflector.underscore(Inflector.demodulize(class_name)) +
|
36
|
-
(separate_class_name_and_id_with_underscore ? "_id" : "id")
|
37
|
-
end
|
38
|
-
|
39
|
-
private
|
40
|
-
def plural_rules #:doc:
|
41
|
-
[
|
42
|
-
[/(x|ch|ss)$/, '\1es'], # search, switch, fix, box, process, address
|
43
|
-
[/([^aeiouy]|qu)y$/, '\1ies'], # query, ability, agency
|
44
|
-
[/(?:([^f])fe|([lr])f)$/, '\1\2ves'], # half, safe, wife
|
45
|
-
[/sis$/, 'ses'], # basis, diagnosis
|
46
|
-
[/([ti])um$/, '\1a'], # datum, medium
|
47
|
-
[/person$/, 'people'], # person, salesperson
|
48
|
-
[/man$/, 'men'], # man, woman, spokesman
|
49
|
-
[/child$/, 'children'], # child
|
50
|
-
[/s$/, 's'], # no change (compatibility)
|
51
|
-
[/$/, 's']
|
52
|
-
]
|
53
|
-
end
|
54
|
-
|
55
|
-
def singular_rules #:doc:
|
56
|
-
[
|
57
|
-
[/(x|ch|ss)es$/, '\1'],
|
58
|
-
[/([^aeiouy]|qu)ies$/, '\1y'],
|
59
|
-
[/([lr])ves$/, '\1f'],
|
60
|
-
[/([^f])ves$/, '\1fe'],
|
61
|
-
[/(analy|ba|diagno|parenthe|progno|synop|the)ses$/, '\1sis'],
|
62
|
-
[/([ti])a$/, '\1um'],
|
63
|
-
[/people$/, 'person'],
|
64
|
-
[/men$/, 'man'],
|
65
|
-
[/status$/, 'status'],
|
66
|
-
[/children$/, 'child'],
|
67
|
-
[/s$/, '']
|
68
|
-
]
|
69
|
-
end
|
70
|
-
end
|