Commit Graph

53968 Commits

Author SHA1 Message Date
Rafael Mendonça França
d68e81afa0 Merge pull request #21858 from Gaurav2728/protected_method_nodoc
nodoc for active support protected method [CI skip]
2015-10-20 15:04:00 -02:00
Yves Senn
8572634450 Merge pull request #22003 from yui-knk/remove_needless_require_as
Delete needless `require 'active_support/deprecation'`
2015-10-20 13:46:50 +02:00
Yves Senn
b6127d8871 Merge pull request #22004 from yui-knk/fix_method_to_action
[ci skip] Replace "destroy` method" with `destroy` action`
2015-10-20 13:43:16 +02:00
yui-knk
666e2cc654 [ci skip] Replace "destroy method" with destroy action
Sure this is `destroy` method of PhotosController, but in this chapter
these methods which mapped by the router are called "action".
For example:

```ruby
get '/patients/:id', to: 'patients#show'
```

is described to dispatch "controller's `show` action".
2015-10-20 20:24:07 +09:00
yui-knk
1099329be0 Delete needless require 'active_support/deprecation'
When `require 'active_support/rails'`, 'active_support/deprecation'
is automatically loaded.
2015-10-20 20:02:59 +09:00
Sean Griffin
9be4ea8184 Merge pull request #21978 from ctreatma/console_helper_reload
Fix #21977: Removes memoization of helpers in Rails console
2015-10-19 19:41:15 -06:00
Sean Griffin
09f057d193 Merge pull request #21987 from yui-knk/refactor_where
Green version of moving the handling of supported arguments to `where`
2015-10-19 19:39:55 -06:00
Sean Griffin
d57d5595c0 Merge pull request #22001 from cleverlemming/doc_patch_engines
Added context for running engine:migrations:install task. [ci skip]
2015-10-19 19:36:43 -06:00
Simon H
407c87011d added Rails 4 context for migrations:install task 2015-10-19 17:33:02 -06:00
Claudio B.
b859d97081 Merge pull request #21991 from philr/doc_tzinfo_no_longer_bundled
Remove outdated documentation regarding a bundled version of TZInfo
2015-10-19 13:48:12 -07:00
Santiago Pastorino
b456e76f58 Merge pull request #21999 from agis-/param-encoding-errors
Show helpful messages on invalid param. encodings
2015-10-19 13:11:19 -02:00
Kevin Deisz
3e3f3563b8 Allow rake:stats to account for rake tasks 2015-10-19 10:36:30 -04:00
Agis Anastasopoulos
3f81b3753f Show helpful messages on invalid param. encodings
Prior to this change, given a route:

    # config/routes.rb
    get ':a' => "foo#bar"

If one pointed to http://example.com/%BE (param `a` has invalid encoding),
a `BadRequest` would be raised with the following non-informative message:

    ActionController::BadRequest

From now on the message displayed is:

    Invalid parameter encoding: hi => "\xBE"

Fixes #21923.
2015-10-19 17:36:22 +03:00
jbranchaud
d9bb13ba04 Reorder application of has_many association constraints.
With `unscope!` called last, it undoes `where` constraints of the same
value when the `where` is chained after the `unscope`. This is what a
`rewhere` does. This is undesirable behavior.

The included tests demonstrate both the `unscope(...).where(...)`
behavior as well as the direct use of `rewhere(...)`.

This is in reference to #21955.
2015-10-19 09:30:33 -05:00
Phil Ross
2cecd21370 Remove outdated statement about bundled TZInfo.
The bundled version of TZInfo referred to was removed from Active
Support in version 3.0.
2015-10-18 22:06:54 +01:00
Arthur Nogueira Neves
dd2c94aea6 Merge pull request #21988 from y-yagi/remove_useless_method
remove useless method
2015-10-18 11:46:04 -04:00
Eileen M. Uchitelle
c2ed6bfab2 Merge pull request #21989 from imtayadeway/guides/active-model-basics
[ci skip] Improve readability in active model basics guide
2015-10-18 10:46:13 -04:00
Tim Wade
3c0ae9da87
[ci skip] Improve readability in active model basics guide
* adds/removes a few words
* removes an unnecessary comma
2015-10-18 07:35:54 -07:00
yuuji.yaginuma
93d99c55bd remove useless method
`images` method has been deleted in 2bc4856, `create_images_directory` does nothing.
2015-10-18 15:41:07 +09:00
yui-knk
b27fb2d8e7 Green version of moving the handling of supported arguments to where
This commit follow up of 4d8f62d.
The difference from 4d8f62d are below:

* Change `WhereClauseFactory` to accept `Arel::Nodes::Node`
* Change test cases of `relation_test.rb`
2015-10-18 10:51:03 +09:00
Rafael Mendonça França
6c36c369be Revert "Move the handling of supported arguments to where"
This reverts commit 4d8f62dcfa0a5157b3facbd71f75fc6639636347.

Reason: This broke the build. Please recommit again when it is green.
2015-10-17 19:40:10 -03:00
Yves Senn
bae2292d8f Merge pull request #21982 from yui-knk/test_suppress_warning
Suppress warnings of `assigned but unused variable`
2015-10-17 16:44:16 +02:00
Richard Schneeman
a5e1bc813b Merge pull request #21980 from maratgaliev/timezones_fix
Use "rake time:zones:all" instead of "rake -D time" [ci skip]
2015-10-17 08:38:10 -05:00
yui-knk
3973a48307 Suppress warnings of assigned but unused variable 2015-10-17 17:16:16 +09:00
Marat Galiev
706850a443 Use "rake time:zones:all" instead of "rake -D time" [ci skip] 2015-10-17 09:17:42 +03:00
Charles Treatman
fa65b44b28 Fix #21977: Removes memoization of helpers in Rails console
In the Rails console, the `helper` function provides a shorthand for
working with application helpers.  However, `helper` memoizes the
value of `ApplicationController#helpers`. This means that if a user
subsequently changes helper code and calls `reload!` in the console,
their code changes will not be reflected by the `helper` function,
even though the helper was, in fact, reloaded.
2015-10-16 19:28:38 -04:00
schneems
101821410b [ci skip] Add backend queue starting documentation
If you can't start your queue, you won't process much. This change adds external links to the Queue backends that have Active Job specific docs.
2015-10-16 18:24:58 -05:00
Sean Griffin
4d8f62dcfa Move the handling of supported arguments to where
`WhereClauseFactory` handles all other branches based on argument types,
so the code fits more naturally here, and it's just where the
responsibility belongs.
2015-10-16 09:51:47 -07:00
Matthew Draper
833aef438d Merge pull request #21953 from bdunne/fix_dep_warn
Fix deprecation warning messages on deprecate_methods
2015-10-17 03:17:21 +10:30
Sean Griffin
cd4575f98c Merge pull request #21944 from jwworth/issue-20473
where raises ArgumentError on unsupported argument types
2015-10-16 09:25:39 -07:00
Jake Worth
7663376f07 where raises ArgumentError on unsupported types.
[#20473]
2015-10-16 09:23:15 -05:00
Maarten Jacobs
86d2924a11 fixes #21815
The default timestamp used for AR is `updated_at` in nanoseconds! (:nsec) This causes issues on any machine that runs an OS that supports nanoseconds timestamps, i.e. not-OS X, where the cache_key of the record persisted in the database (milliseconds precision) is out-of-sync with the cache_key in the ruby VM.

This commit adds:

A test that shows the issue, it can be found in the separate file `cache_key_test.rb`, because
- model couldn't be defined inline
- transactional testing needed to be turned off to get it to pass the MySQL tests
This seemed cleaner than putting it in an existing testcase file.

It adds :usec as a dateformat that calculates datetime in microseconds

It sets precision of cache_key to :usec instead of :nsec, as no db supports nsec precision on timestamps
2015-10-16 15:09:45 +02:00
Yves Senn
b3656076d6 Merge pull request #21969 from ignatiusreza/remove_readonly_option_doc
Remove mentioned of 'readonly' options in doc for HABTM [ci skip]
2015-10-16 10:32:09 +02:00
Ignatius Reza
15f7519361 [ci skip] readonly options has been removed 2015-10-16 16:52:19 +09:00
Aaron Patterson
960de47f0e drop array allocations when iterating over the hash
`each_with_object` allocates an array for each kv pair.  Switching to
the slightly more verbose but less allocatey `each_pair` eliminates
array allocations.  Eliminating this allocation returns AR objects to
have constant array allocations regardless of the number of columns the
object has.

Here is test code:

```ruby
require 'active_record'

class Topic < ActiveRecord::Base
end

20.times do |i|
  Process.waitpid fork {
    ActiveRecord::Base.establish_connection adapter: 'sqlite3', database: ':memory:'

    ActiveRecord::Base.connection.instance_eval do
      create_table(:topics) do |t|
        t.string   :title, limit: 250
        t.string   :author_name
        t.string   :author_email_address
        t.string   :parent_title
        t.string   :type
        t.string   :group
        i.times do |j|
          t.string :"aaa#{j}"
        end
        t.timestamps null: true
      end
    end

    ObjectSpace::AllocationTracer.setup(%i{type})

    Topic.create title: "aaron" # heat cache

    result = ObjectSpace::AllocationTracer.trace do
      10.times do |i|
        Topic.create title: "aaron #{i}"
      end
    end

    puts "#{Topic.columns.length},#{(result.find { |k,v| k.first == :T_ARRAY }.last.first / 10)}"
  }
end
```

Before this commit:

```
9,166
10,167
11,168
12,169
13,170
14,171
15,172
16,173
17,174
18,175
19,176
20,177
21,178
22,179
23,180
24,181
25,182
26,183
27,184
28,185
```

After:

```
9,157
10,157
11,157
12,157
13,157
14,157
15,157
16,157
17,157
18,157
19,157
20,157
21,157
22,157
23,157
24,157
25,157
26,157
27,157
28,157
```

Left side is the number of columns, right is the number of allocations
2015-10-15 14:44:28 -07:00
Rafael Mendonça França
3b61027092 Merge pull request #21966 from AnnaErshova/dbreset-edit
Clarifies db can be set up from structure.sql as well as from schema.rb
2015-10-15 18:37:19 -03:00
Anna Ershova
5cde56e173 Update active_record_migrations.md
Add 'db/'; corrects structure.rb to structure.sql
2015-10-15 16:37:11 -04:00
Aaron Patterson
3253185b36 make string allocation constant regardless of column count
deep_dup'ing a hash will dup the keys as well as the values.  Since
string keys from the source hash will be frozen, and the dup'd objects
are immediately dup'd and frozen on insert in to the hash, the end user
will only ever see two frozen strings.  Since the strings are immutable,
this commit just cheats a little and reuses the immutable strings.

Just to reiterate, before this commit, deep duping a hash that looks
like this: `{ "foo" => "bar" }` will generate two new instances of
"foo". One is created when `deep_dup` is called on "foo", and the other
is created when the newly allocated "foo" string is inserted in to the
hash.  The user never sees the intermediate "foo", and both copies of
"foo" that the user *can* access will be frozen, so in this case we just
reuse the existing frozen key.

The upshot is that after this change, string allocations on AR
allocations become constant regardless of the number of columns the
model has.

```ruby
require 'active_record'

class Topic < ActiveRecord::Base
end

20.times do |i|
  Process.waitpid fork {
    ActiveRecord::Base.establish_connection adapter: 'sqlite3', database: ':memory:'

    ActiveRecord::Base.connection.instance_eval do
      create_table(:topics) do |t|
        t.string   :title, limit: 250
        t.string   :author_name
        t.string   :author_email_address
        t.string   :parent_title
        t.string   :type
        t.string   :group
        i.times do |j|
          t.integer :"aaa#{j}"
        end
        t.timestamps null: true
      end
    end

    ObjectSpace::AllocationTracer.setup(%i{type})

    Topic.create title: "aaron" # heat cache

    result = ObjectSpace::AllocationTracer.trace do
      10.times do |i|
        Topic.create title: "aaron #{i}"
      end
    end

    puts "#{Topic.columns.length},#{(result.find { |k,v| k.first == :T_STRING }.last.first / 10)}"
  }
end
```

If you run the above script before this commit, the output looks like
this:

```
[aaron@TC rails (master)]$ be ruby -rallocation_tracer test.rb
9,105
10,107
11,109
12,111
13,113
14,115
15,117
16,119
17,121
18,123
19,125
20,127
21,129
22,131
23,133
24,135
25,137
26,139
27,141
28,143
```

The left column is the number of methods, the right column is the number
of string allocations.

Running against this commit, the output is:

```
[aaron@TC rails (master)]$ be ruby -rallocation_tracer test.rb
9,87
10,87
11,87
12,87
13,87
14,87
15,87
16,87
17,87
18,87
19,87
20,87
21,87
22,87
23,87
24,87
25,87
26,87
27,87
28,87
```

As you can see, there is now only a constant number of strings
allocated, regardless of the number of columns the model has.
2015-10-15 13:33:42 -07:00
Andrew White
3acc590d50 Merge pull request #21946 from davidcelis/fix-time-zone-utc-predicate
Expand support for ActiveSupport::TimeWithZone#utc?
2015-10-15 18:51:04 +01:00
Sean Griffin
d6919c524a All strings returned by ImmutableString should be frozen
I seriously don't even know why we handle booleans, but those strings
should technically be frozen. Additionally, we don't need to actually
check the class in the mutable string type, since the `cast_value`
function will always return a string.
2015-10-15 09:55:30 -07:00
Sean Griffin
34321e4a43 Add an immutable string type to opt out of string duping
This type adds an escape hatch to apps for which string duping causes
unacceptable memory growth. The reason we are duping them is in order to
detect mutation, which was a feature added to 4.2 in #15674. The string
type was modified to support this behavior in #15788.

Memory growth is really only a concern for string types, as it's the
only mutable type where the act of coersion does not create a new object
regardless (as we're usually returning an object of a different class).

I do feel strongly that if we are going to support detecting mutation,
we should do it universally for any type which is mutable. While it is
less common and ideomatic to mutate strings than arrays or hashes, there
shouldn't be rules or gotchas to understanding our behavior.

However, I also appreciate that for apps which are using a lot of string
columns, this would increase the number of allocations by a large
factor. To ensure that we keep our contract, if you'd like to opt out of
mutation detection on strings, you'll also be option out of mutation of
those strings.

I'm not completely married to the thought that strings coming out of
this actually need to be frozen -- and I think the name is correct
either way, as the purpose of this is to provide a string type which
does not detect mutation.

In the new implementation, I'm only overriding `cast_value`. I did not
port over the duping in `serialize`. I cannot think of a reason we'd
need to dup the string there, and the tests pass without it.
Unfortunately that line was introduced at a time where I was not nearly
as good about writing my commit messages, so I have no context as to
why I added it. Thanks past Sean. You are a jerk.
2015-10-15 09:50:37 -07:00
David Celis
8e847dcde8 Expand support for ActiveSupport::TimeWithZone#utc?
Currently, ActiveSupport::TimeWithZone#utc? simply runs a check to see
if the linked ActiveSupport::TimeZone's name is "UTC". This will only
return true for ActiveSupport::TimeZone["UTC"], but not for time zones
such as "Etc/UTC", "Etc/Universal", or other time zones that are aliases
for UTC. Interestingly enough, ActiveSupport::TimeWithZone#utc? is also
aliased as #gmt? but will return false for the "GMT" timezone (along
with other TZInfo aliases for GMT).

Instead of running a simple check on the TimeZone name, we can rely on
the underlying TZInfo::TimezonePeriod and TZInfo::TimezoneOffset which
keep a record of of the offset's abbreviated name. The possibilities
here for UTC time zones are `:UTC`, `:UCT`, and `:GMT`.

Signed-off-by: David <me@davidcel.is>
2015-10-15 09:25:34 -07:00
Sean Griffin
de92b06bca Merge pull request #21964 from Drenmi/enhancement/update-deprecation-message
Better deprecation warning for `ActiveRecord::Relation#update`
2015-10-15 08:09:18 -07:00
AnnaErshova
0166adcee8 Clarifies db can be set up from structure.sql also
I added that *structure.sql* file can be used when *db:reset* is run.

*db:reset* tasks states *db:reset* loads database from *db/schema.rb*
or *db/structure.sql* depending on the configuration (although
*db/schema.rb* is the default), hence the change.
2015-10-15 09:36:57 -04:00
Ted Johansson
b901a49473 Add deprecation warning to ActiveRecord::Relation#update
When passing an instance of `ActiveRecord::Base` to `#update`, it would
internally call `#find`, resulting in a misleading deprecation warning.

This change gives this deprecated use of `#update` its own, meaningful
warning.
2015-10-15 17:00:28 +08:00
Ryuta Kamizono
d39b6f77fc Add stored procedure test in mysql2 2015-10-15 13:18:21 +09:00
Aaron Patterson
b6cf69ebcb freeze the column name to drop string allocations in dirty checks
Dirty checking keeps a hash where the keys are the column name and the
value is a dup of the value from the database[1].  This hash is kept for
every AR object, which means that we dup every column name for every AR
object that does dirty checking.  Freezing the column name prevents the
column name from being duped and reduced overall string allocations.

Here is a benchmark to demonstrate:

```ruby
require 'active_record'

class Topic < ActiveRecord::Base
end

20.times do |i|
  Process.waitpid fork {
    ActiveRecord::Base.establish_connection adapter: 'sqlite3', database: ':memory:'

    ActiveRecord::Base.connection.instance_eval do
      create_table(:topics) do |t|
        t.string   :title, limit: 250
        t.string   :author_name
        t.string   :author_email_address
        t.string   :parent_title
        t.string   :type
        t.string   :group
        i.times do |j|
          t.string :"aaa#{j}"
        end
        t.timestamps null: true
      end
    end

    ObjectSpace::AllocationTracer.setup(%i{type})

    Topic.create title: "aaron" # heat cache

    result = ObjectSpace::AllocationTracer.trace do
      10.times do |i|
        Topic.create title: "aaron #{i}"
      end
    end

    puts "#{Topic.columns.length},#{(result.find { |k,v| k.first == :T_STRING }.last.first / 10)}"
  }
end
```

1. 3ad381c3f8/activerecord/lib/active_record/attribute_set/builder.rb (L102)
2015-10-14 18:06:56 -07:00
Ryuta Kamizono
d9e74ace9f Make AbstractMysqlAdapter#version public 2015-10-15 07:18:55 +09:00
Ryuta Kamizono
f8438ae336 Fix to correctly schema dump the tinyblob
Currently `tinyblob` is dumped to `t.binary "tiny_blob", limit: 255`.
But `t.binary ... limit: 255` is generating SQL to `varchar(255)`.
It is incorrect. This commit fixes this problem.
2015-10-15 05:38:43 +09:00
Arthur Nogueira Neves
3ad381c3f8 Merge pull request #21961 from Gaurav2728/migration_class_methods_nodoc
migrations Class methods have nodoc, fix it for API [ci skip]
2015-10-14 14:18:23 -04:00