1. 26 11月, 2015 1 次提交
  2. 24 11月, 2015 3 次提交
  3. 21 11月, 2015 1 次提交
  4. 20 11月, 2015 2 次提交
    • S
      Revert "Allow specifying the default table options for mysql adapters" · 6b7861e8
      Sean Griffin 提交于
      This reverts commit 8246b593.
      
      There was concern about this modifying the behavior of past migrations.
      We're going to add an way to modify the migration generator instead.
      6b7861e8
    • S
      Allow specifying the default table options for mysql adapters · 8246b593
      Sean Griffin 提交于
      It's often the case that you want to have an option that you cannot
      specify at the database level, but want applied to *all* tables that you
      create. For example, you might want to specify `ROW_FORMAT=DYNAMIC` to
      not have to limit text columns to length 171 for indexing when using
      utf8mb4. This allows an easy way to specify this in your database
      configuration.
      
      While this change affects both MySQL and MySQL2, the test only covers
      MySQL2, as the legacy mysql adapter appears to always return ASCII
      strings, and is tangential to what we're actually doing.
      8246b593
  5. 18 11月, 2015 1 次提交
    • S
      Rename 'key' to 'lock_id' or 'lock_name' for advisory locking · 5ce21d4f
      Sam Davies 提交于
      - key was a poor choice of name. A key implies something that will
        unlock a lock. The concept is actually more like a 'lock identifier'
      - mysql documentation calls this a 'lock name'
      - postgres documentation calls it a 'lock_id'
      - Updated variable names to reflect the preferred terminology for the database in
        question
      5ce21d4f
  6. 17 11月, 2015 1 次提交
  7. 16 11月, 2015 3 次提交
    • Y
      Except keys of `build_record`'s argument from `create_scope` in initialize_attributes · 817c1825
      yui-knk 提交于
      If argument of `build_record` has key and value which is same as
      default value of database, we should also except the key from
      `create_scope` in `initialize_attributes`.
      Because at first `build_record` initialize record object with argument
      of `build_record`, then assign attributes derived from Association's scope.
      In this case `record.changed` does not include the key, which value is
      same as default value of database, so we should add the key to except list.
      
      Fix #21893.
      817c1825
    • S
      Freeze association foreign keys to reduce allocations · e38e0c61
      Sean Griffin 提交于
      The string returned here will ultimately get used as a key of a hash in
      the attribute set once the attributes are being built. When you give a
      non-frozen string to `Hash#[]`, it will be duped. Be freezing we can
      significantly reduce the number of times we end up allocating
      `"user_id"`
      
      This does not include any additional tests, as this should not have any
      public facing implications. If you are mutating the result of
      `Reflection#foreign_key`, please stop.
      e38e0c61
    • R
      Remove not needed `NATIVE_DATABASE_TYPES` entries · 500eefdc
      Ryuta Kamizono 提交于
      500eefdc
  8. 12 11月, 2015 1 次提交
  9. 09 11月, 2015 1 次提交
    • Y
      Deprecate `#table_exists?`, `#tables` and passing arguments to `#talbes` · 7429633b
      yui-knk 提交于
      Reported on #21509, how views is treated by `#tables` are differ
      by each adapters. To fix this different behavior, after Rails 5.0
      is released, deprecate `#tables`.
      
      And `#table_exists?` would check both tables and views.
      To make their behavior consistent with `#tables`, after Rails 5.0
      is released, deprecate `#table_exists?`.
      7429633b
  10. 08 11月, 2015 7 次提交
  11. 07 11月, 2015 2 次提交
  12. 05 11月, 2015 1 次提交
  13. 04 11月, 2015 2 次提交
  14. 03 11月, 2015 1 次提交
  15. 02 11月, 2015 4 次提交
    • Y
      Make `db:migrate:status` to render `1_some.rb` format migrate files. · a7beeb7f
      yui-knk 提交于
      `1_valid_people_have_last_names.rb` and
      `20150823202140_create_users.rb` are valid migration file name.
      But `1_valid_people_have_last_names.rb` is rendered as
      `********** NO FILE **********` when `rake db:migrate:status`.
      
      Fix to this bug, this commit includes
      
      * define some API private methdos and a Constant
        `match_to_migration_filename?`, `parse_migration_filename`, and
        `MigrationFilenameRegexp`
      * use these methods in `db:migrate:status` task
      
      Example:
      
      These files are in `db/migrate`
      
      * 1_valid_people_have_last_names.rb
      * 20150819202140_irreversible_migration.rb
      * 20150823202140_add_admin_flag_to_users.rb
      * 20150823202141_migration_tests.rb
      * 2_we_need_reminders.rb
      * 3_innocent_jointable.rb
      
      we can migrate all of them.
      
      Before
      
      ```shell
      $ bundle exec rake db:migrate:status
      
      ...
      
       Status   Migration ID    Migration Name
      --------------------------------------------------
         up     001             ********** NO FILE **********
         up     002             ********** NO FILE **********
         up     003             ********** NO FILE **********
         up     20150819202140  Irreversible migration
         up     20150823202140  Add admin flag to users
         up     20150823202141  Migration tests
      ```
      
      After
      
      ```shell
      $ bundle exec rake db:migrate:status
      
      ...
      
       Status   Migration ID    Migration Name
      --------------------------------------------------
         up     001             Valid people have last names
         up     002             We need reminders
         up     003             Innocent jointable
         up     20150819202140  Irreversible migration
         up     20150823202140  Add admin flag to users
         up     20150823202141  Migration tests
      ```
      a7beeb7f
    • Y
      Define `sanitize_sql_for_order` for AR and use it inside `preprocess_order_args` · 6011ab85
      yui-knk 提交于
      This commit follows up of 6a6dbb4c.
      6011ab85
    • R
      Allow bigint with default nil for avoiding auto increment primary key · 1fa6c9e5
      Ryuta Kamizono 提交于
      Such as #10404, #18206.
      1fa6c9e5
    • R
      Remove `DEFAULT_CHARSET` and `DEFAULT_COLLATION` in `MySQLDatabaseTasks` · 322068fe
      Ryuta Kamizono 提交于
      This reverts commit f6ca7e4e.
      
      The default collation of utf8 in MySQL is the `utf8_general_ci`, and
      this should not be changed. This is because, the better collation in the
      all locales is not exists, optimal collation in own application is not
      known other than themselves.
      
      The `utf8_unicode_ci` is known as Japanese killer in Japan, there are
      serious impacts in search of Japanese.
      
      MySQL implements the `utf8_unicode_ci` according to the Unicode
      Collation Algorithm (UCA) described at http://www.unicode.org/reports/tr10/,
      but the `utf8_unicode_ci` have only partial support for the UCA, only
      primary level key comparison implemented (also known as L1 (Base
      characters) comparison).
      
      Because L1 (Base characters) comparison does not distinguish between the
      presence or absence of the accent, if distinction of the accent is
      important there is a serious impact (e.g. Japanese).
      
      Example:
      
      ```
      > SHOW CREATE TABLE `dicts`\G
      *************************** 1. row ***************************
             Table: dicts
      Create Table: CREATE TABLE `dicts` (
        `word` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
        `meaning` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
      1 row in set (0.00 sec)
      
      > INSERT INTO `dicts` VALUES ('ハハ', 'mother'), ('パパ', 'father');
      Query OK, 2 rows affected (0.00 sec)
      
      > SELECT * FROM `dicts` WHERE `word` = 'ハハ';
      +--------+---------+
      | word   | meaning |
      +--------+---------+
      | ハハ   | mother  |
      | パパ   | father  |
      +--------+---------+
      2 rows in set (0.00 sec)
      
      > CREATE UNIQUE INDEX `unique_index_word` ON `dicts`(`word`);
      ERROR 1062 (23000): Duplicate entry 'ハハ' for key 'unique_index_word'
      ```
      
      We should omit the collation entirely rather than providing a default.
      Then the choice is the responsibility of the server and MySQL distribution.
      322068fe
  16. 31 10月, 2015 2 次提交
    • S
      Use advisory locks to prevent concurrent migrations · 2c2a8755
      Sam Davies 提交于
      - Addresses issue #22092
      - Works on Postgres and MySQL
      - Uses advisory locks because of two important properties:
        1. The can be obtained outside of the context of a transaction
        2. They are automatically released when the session ends, so if a
        migration process crashed for whatever reason the lock is not left
        open perpetually
      - Adds get_advisory_lock and release_advisory_lock methods to database
        adapters
      - Attempting to run a migration while another one is in process will
        raise a ConcurrentMigrationError instead of attempting to run in
        parallel with undefined behavior. This could be rescued and
        the migration could exit cleanly instead. Perhaps as a configuration
        option?
      
      Technical Notes
      ==============
      
      The Migrator uses generate_migrator_advisory_lock_key to build the key
      for the lock. In order to be compatible across multiple adapters there
      are some constraints on this key.
      - Postgres limits us to 64 bit signed integers
      - MySQL advisory locks are server-wide so we have to scope to the
        database
      - To fulfil these requirements we use a Migrator salt (a randomly
        chosen signed integer with max length of 31 bits) that identifies
        the Rails migration process as the owner of the lock. We multiply
        this salt with a CRC32 unsigned integer hash of the database name to
        get a signed 64 bit integer that can also be converted to a string
        to act as a lock key in MySQL databases.
      - It is important for subsequent versions of the Migrator to use the
        same salt, otherwise different versions of the Migrator will not see
        each other's locks.
      2c2a8755
    • T
      Alias left_joins to left_outer_joins · d3411ad3
      Takashi Kokubun 提交于
      d3411ad3
  17. 30 10月, 2015 6 次提交
    • S
      Ensure `has_and_belongs_to_many` works with `belongs_to_required_by_default` · 21a386bb
      Sean Griffin 提交于
      Before this commit, if
      `ActiveRecord::Base.belongs_to_required_by_default` is set to `true`,
      then creating a record through `has_and_belongs_to_many` fails with the
      cryptic error message `Left side must exist`. This is because
      `inverse_of` isn't working properly in this case, presumably since we're
      doing trickery with anonymous classes in the middle.
      
      Rather than following this rabbit hole to try and get `inverse_of` to
      work in a case that we know is not publicly supported, we can just turn
      off this validation to match the behavior of 4.2 and earlier.
      21a386bb
    • H
      6a9323bc
    • S
      Never pass `nil` to `order` · a59a4fbd
      Sean Griffin 提交于
      This is part of a refactoring to make it easier to allow `order` to use
      sanitize like just about everything else on relation. The deleted test
      doesn't give any reasoning as to why passing `nil` to `order` needs to
      be supported, and it's rather nonsensical. I can almost see allowing an
      empty string being passed (though I'm tempted to just disallow it...)
      a59a4fbd
    • J
      FixtureSet.fixture_class_names should have no default value · 0c843640
      Jamis Buck 提交于
      Look at `TestFixtures.set_fixture_class`. As documented, it
      accepts a mapping of fixture identifiers (string or symbol) to Classes
      (the model classes that implement the named fixture).
      
      Look now at the initialization of `TestFixtures.fixture_class_names`.
      It defines a Hash, which will return a string by default (where the
      string is the estimated class name of the given fixture identifier).
      
      Now look at TestFixtures.load_fixtures. It calls `FixtureSet.create_fixtures`,
      passing in the mapping of `fixture_class_names`.
      
      Following this on to `FixtureSet.create_fixtures`, this instantiates a
      `FixtureSet::ClassCache`, passing in the map of class names.
      
      `ClassCache`, in turn, calls `insert_class` for each value in the cache.
      (Recall that `set_fixture_class` puts Class objects in there, while the
      default proc for the mapping puts String objects.)
      
      Look finally at `insert_class`. If the value is present, it checks to
      see if the value is a subclass of `AR::Base`. Fair enough...but wait!
      What if the value is a String? You get an exception, because a String
      instance cannot be compared with a Class.
      
      Judging from the implementation, it seems like the expected behavior
      here is for `fixture_class_names` to have no default proc. Look-ups are
      supposed to happen via `ClassCache`, with `fixture_class_names` existing
      solely as a repository for explicitly-registered class mappings.
      
      That is what this change does.
      0c843640
    • Y
      Revert "Revert "Merge pull request #22026 from akihiro17/fix-preload-association"" · 857a34a4
      Yves Senn 提交于
      This reverts commit 52439460.
      
      This fixes an issue with the build where tests would fail on mysql and
      postgresql due to different ordering.
      857a34a4
    • S
      Revert "Merge pull request #22026 from akihiro17/fix-preload-association" · 52439460
      Sean Griffin 提交于
      This reverts commit 6dc6a0b1, reversing
      changes made to ec94f00b.
      
      This pull request broke the build.
      52439460
  18. 29 10月, 2015 1 次提交
    • S
      Fix a stylistic nitpick in #19501 · b8832c1b
      Sean Griffin 提交于
      We don't need to use `String#+` or create all the intermediate strings
      to break a string into multiple lines. We can just write a c-style
      multiline string literal. This is by no means a hotpath, but this is
      clearer to me anyway.
      b8832c1b