Commit Graph

13944 Commits

Author SHA1 Message Date
Yves Senn
cd3983a95a Merge pull request #17885 from starbelly/patch-1
Add method to run command-line db apps

Conflicts:
	activerecord/CHANGELOG.md
2015-08-11 15:57:40 +02:00
Rafael Mendonça França
5ffbcf12f3 Merge pull request #21165 from manlon/master
use correct DB connection for generated HABTM table
2015-08-11 09:26:47 -03:00
Miles Starkenburg
468cdfcc85 Reference actual classes 2015-08-08 13:15:28 -07:00
Matt Hanlon
5ec9e9349e use correct DB connection for generated HABTM table 2015-08-07 12:33:09 -07:00
Zachary Scott
f7ebdb1ac5 Remove XML Serialization from core.
This includes the following classes:

- ActiveModel::Serializers::Xml
- ActiveRecord::Serialization::XmlSerializer
2015-08-07 11:01:48 -04:00
Sina Siadat
25cee1f037 Add ActiveRecord::Relation#in_batches
`in_batches` yields Relation objects if a block is given, otherwise it
returns an instance of `BatchEnumerator`. The existing `find_each` and
`find_in_batches` methods work with batches of records. The new API
allows working with relation batches as well.

Examples:

    Person.in_batches.each_record(&:party_all_night!)
    Person.in_batches.update_all(awesome: true)
    Person.in_batches.delete_all
    Person.in_batches.map do |relation|
      relation.delete_all
      sleep 10 # Throttles the delete queries
    end
2015-08-07 10:26:38 +04:30
Sean Griffin
0cfa496697 Merge pull request #20459 2015-08-06 16:24:09 -06:00
Rafael Mendonça França
22625a353e Merge pull request #21092 from vngrs/use_memoization_for_ids_reader
Use memoization for collection associations ids reader
2015-08-06 17:38:36 -03:00
Brendan Buckingham
2bba65a2c6 better docs for ActiveRecord::Migration#table_name_options 2015-08-06 16:53:25 -03:00
Ryuta Kamizono
977ffe8806 Should use server_info[:version] instead of info[:version]
Because `info[:version]` is a client version, the server version is
`server_info[:version]`.
2015-08-04 05:04:02 +09:00
Mehmet Emin İNAÇ
f744d62736 Use memoization for collection associations ids reader
Fixes #21082

remove extra space
2015-08-03 06:40:14 +03:00
Mehmet Emin İNAÇ
f5c2b49d85 Fix ambiguous argument warning
encapsulate all arguments
2015-08-02 22:40:25 +03:00
Sean Griffin
722abe1722 Fix test failures caused by #20884
PostgreSQL is strict about the usage of `DISTINCT` and `ORDER BY`, which
one of the tests demonstrated. The order clause is never going to be
relevant in the query we're performing, so let's just remove it
entirely.
2015-08-01 18:15:46 -06:00
Sean Griffin
cc10911199 Merge pull request #20884
Add #cache_key to ActiveRecord::Relation.
2015-08-01 18:04:07 -06:00
starbelly
07f8a96aa1 Add run_cmd class method to ActiveRecord::Tasks::DatabaseTasks
-   Added run_cmd() class method to dry up Kernel.system() messages within
      this namespace and avoid shell expansion by passing a list of
      arguments instead of a string

  -   Update structure_dump, structure_load, and related tests units to
      pass a list of params instead of using a string to
      avoid shell expansion
2015-08-01 16:53:25 -05:00
Yves Senn
54901acbc9 minor AR changelog edits. [ci skip] 2015-08-01 12:12:54 +02:00
schneems
f80aa59946 Decrease string allocations on AR#respond_to?
When a symbol is passed in, we call `to_s` on it which allocates a string. The two hardcoded symbols that are used internally are `:to_partial_path` and `:to_model`.

This change buys us 71,136 bytes of memory and 1,777 fewer objects per request.
2015-07-29 20:41:57 -05:00
Robin Dupret
a74fbb2972 Add :nodoc: for internal testing methods [ci skip] 2015-07-28 12:22:37 +02:00
Rafael Mendonça França
722b2729b0 Merge pull request #20849 from vngrs/misleading_nested_exceptions
Fix misleading errors for has_one through relations
2015-07-27 17:28:24 -03:00
Yasuo Honda
330f749567 Remove @connection instance variable only when defined 2015-07-26 01:09:05 +00:00
Sean Griffin
119b9181ec Properly allow uniqueness validations on primary keys.
This is an alternate implementation of #20966.

[Sean Griffin & presskey]
2015-07-25 13:05:53 -06:00
Sean Griffin
d937a1175f destroy shouldn't raise when child associations fail to save
Deep down in the association internals, we're calling `destroy!` rather
than `destroy` when handling things like `dependent` or autosave
association callbacks. Unfortunately, due to the structure of the code
(e.g. it uses callbacks for everything), it's nearly impossible to pass
whether to call `destroy` or `destroy!` down to where we actually need
it.

As such, we have to do some legwork to handle this. Since the callbacks
are what actually raise the exception, we need to rescue it in
`ActiveRecord::Callbacks`, rather than `ActiveRecord::Persistence` where
it matters. (As an aside, if this code wasn't so callback heavy, it
would handling this would likely be as simple as changing `destroy` to
call `destroy!` instead of the other way around).

Since we don't want to lose the exception when `destroy!` is called (in
particular, we don't want the value of the `record` field to change to
the parent class), we have to do some additional legwork to hold onto it
where we can use it.

Again, all of this is ugly and there is definitely a better way to do
this. However, barring a much more significant re-architecting for what
I consider to be a reletively minor improvement, I'm willing to take
this small hit to the flow of this code (begrudgingly).
2015-07-24 09:13:20 -06:00
Sean Griffin
cc214cff7e Merge pull request #20256 from arunagw/aa-remove-unused-rule-and-task-activerecord
Remove unused rule and task from activerecord
2015-07-24 08:45:22 -06:00
Akira Matsuda
430b7c8b51 Remove ivar only when defined
this fixes a failing test case
2015-07-24 06:38:56 +09:00
Robin Dupret
cdc32defcf Improvements on the enum documentation [ci skip]
The note regarding the `_prefix` and `_suffix` options is no longer
useful since they were renamed specifically for this purpose.

Also the given example doesn't show what these options enable and in
which case they are really useful (when there are conflicting values
for instance).

Refs #20999.

[Godfrey Chan & Robin Dupret]
2015-07-23 19:24:13 +02:00
Robin Dupret
ad5c1a3934 Rename the enum_{prefix,suffix} options to _{prefix,suffix}
This makes it more clear that they are reserved keywords and also it
seems less redundant as the line already starts with the call to the
`enum` method.
2015-07-23 14:27:09 +02:00
Дмитро Будник
a20965287c Fixes documentation typo.
Documentation had extra colon after keyword.
2015-07-23 11:41:51 +03:00
Mehmet Emin İNAÇ
4f1ec3ac96 Fix misleading errors for has_one through relations 2015-07-22 00:51:23 +03:00
Mehmet Emin İNAÇ
d2e35e1187 fix rails tests 2015-07-21 23:29:51 +03:00
Sameer Rahmani
d763956ed9 Extra caller details added to ActiveRecord::RecordNotFound
ActiveRecord::RecordNotFound modified to store model name, primary_key
and id of the caller model. It allows the catcher of this exception to make
a better decision to what to do with it. For example consider this simple
example:

    class SomeAbstractController < ActionController::Base
      rescue_from ActiveRecord::RecordNotFound, with: :redirect_to_404

      private def redirect_to_404(e)
        return redirect_to(posts_url) if e.model == 'Post'
        raise
      end
    end
2015-07-21 19:19:14 +04:30
Roque Pinel
b184398b53 Deprecate and rename the keys for association restrict_dependent_destroy
Previously `has_one` and `has_many` associations were using the
`one` and `many` keys respectively. Both of these keys have special
meaning in I18n (they are considered to be pluralizations) so by
renaming them to `has_one` and `has_many` we make the messages more
explicit and most importantly they don't clash with linguistical
systems that need to validate translation keys (and their
pluralizations).

The `:'restrict_dependent_destroy.one'` key should be replaced with
`:'restrict_dependent_destroy.has_one'`, and
`:'restrict_dependent_destroy.many'` with
`:'restrict_dependent_destroy.has_many'`.

[Roque Pinel & Christopher Dell]
2015-07-20 23:19:43 -04:00
Jori Hardman
e975d7cd1a Ensure that microsecond precision is only used for version of mysql that support it. Fixes #19711 2015-07-20 15:30:10 -05:00
Sean Griffin
17b846004d Fix minor typo in test name 2015-07-20 09:22:30 -06:00
Roque Pinel
12b0b26df7 Fix state being carried over from previous transaction
This clears the transaction record state when the transaction finishes
with a `:committed` status.

Considering the following example where `name` is a required attribute.
Before we had `new_record?` returning `true` for a persisted record:

```ruby
  author = Author.create! name: 'foo'
  author.name = nil
  author.save        # => false
  author.new_record? # => true
```
2015-07-20 09:12:01 -06:00
Sean Griffin
c0ef95a1c6 Correctly ignore mark_for_destruction without autosave
As per the docs, `mark_for_destruction` should do nothing if `autosave`
is not set to true. We normally persist associations on a record no
matter what if the record is a new record, but we were always skipping
records which were `marked_for_destruction?`.

Fixes #20882
2015-07-20 09:00:00 -06:00
Sean Griffin
9bd6e39b0c Merge pull request #20949 from vngrs/missing_method_in_exception
Add missing method name to exception description
2015-07-20 08:39:48 -06:00
Mehmet Emin İNAÇ
cc54f6be15 fix doc about ActiveRecord::Transactions::ClassMethods#transaction [ci skip] 2015-07-20 11:11:24 +03:00
Mehmet Emin İNAÇ
1883f37742 Add missing method name to exception description 2015-07-20 10:58:59 +03:00
Alberto F. Capel
476e3f552f Add #cache_key to ActiveRecord::Relation. 2015-07-20 01:46:03 +01:00
Sean Griffin
f91439d848 Merge pull request #20946 from schneems/schneems/let-it-go
Freeze string literals when not mutated.
2015-07-19 17:09:13 -06:00
schneems
5bb1d4d288 Freeze string literals when not mutated.
I wrote a utility that helps find areas where you could optimize your program using a frozen string instead of a string literal, it's called [let_it_go](https://github.com/schneems/let_it_go). After going through the output and adding `.freeze` I was able to eliminate the creation of 1,114 string objects on EVERY request to [codetriage](codetriage.com). How does this impact execution?

To look at memory:

```ruby
require 'get_process_mem'

mem = GetProcessMem.new
GC.start
GC.disable
1_114.times { " " }
before = mem.mb

after = mem.mb
GC.enable
puts "Diff: #{after - before} mb"

```

Creating 1,114 string objects results in `Diff: 0.03125 mb` of RAM allocated on every request. Or 1mb every 32 requests.

To look at raw speed:

```ruby
require 'benchmark/ips'

number_of_objects_reduced = 1_114

Benchmark.ips do |x|
  x.report("freeze")    { number_of_objects_reduced.times { " ".freeze } }
  x.report("no-freeze") { number_of_objects_reduced.times { " " } }
end
```

We get the results

```
Calculating -------------------------------------
              freeze     1.428k i/100ms
           no-freeze   609.000  i/100ms
-------------------------------------------------
              freeze     14.363k (± 8.5%) i/s -     71.400k
           no-freeze      6.084k (± 8.1%) i/s -     30.450k
```

Now we can do some maths:

```ruby
ips = 6_226k # iterations / 1 second
call_time_before = 1.0 / ips # seconds per iteration 

ips = 15_254 # iterations / 1 second
call_time_after = 1.0 / ips # seconds per iteration 

diff = call_time_before - call_time_after

number_of_objects_reduced * diff * 100

# => 0.4530373333993266 miliseconds saved per request
```

So we're shaving off 1 second of execution time for every 220 requests. 

Is this going to be an insane speed boost to any Rails app: nope. Should we merge it: yep. 

p.s. If you know of a method call that doesn't modify a string input such as [String#gsub](b0e2da69f0/lib/let_it_go/core_ext/string.rb (L37)) please [give me a pull request to the appropriate file](b0e2da69f0/lib/let_it_go/core_ext/string.rb (L37)), or open an issue in LetItGo so we can track and freeze more strings. 

Keep those strings Frozen

![](https://www.dropbox.com/s/z4dj9fdsv213r4v/let-it-go.gif?dl=1)
2015-07-19 17:45:10 -05:00
Sean Griffin
8cd1d5a41c Fix the test that was broken by #16445 rather than deleting it
Since the counter cache was properly being updated, the model became
stale. Simply reloading the model before attempting to destroy is
sufficient for this case. I believe this is enough of an edge case to be
a valid change to the tests, even though it represents a potential
breaking change.
2015-07-19 15:52:31 -06:00
Stefan Kanev
0ed096ddf5 Fix counter_cache for polymorphic associations
Also removes a false positive test that depends on the fixed bug:

At this time, counter_cache does not work with polymorphic relationships
(which is a bug). The test was added to make sure that no
StaleObjectError is raised when the car is destroyed. No such error is
currently raised because the lock version is not incremented by
appending a wheel to the car.

Furthermore, `assert_difference` succeeds because `car.wheels.count`
does not check the counter cache, but the collection size. The test will
fail if it is replaced with `car.wheels_count || 0`.
2015-07-19 15:52:29 -06:00
Abdelkader Boudih
fac744f87e Merge pull request #20924 from andrii/master
[ci skip] Fix typo in #any? RDoc
2015-07-19 09:27:49 +01:00
Sean Griffin
3f1c5d39c0 Merge pull request #20932 from twalpole/collection_association_parameters
Ensure that 'ActionController::Parameters' can still be passed to AR …
2015-07-18 13:21:06 -05:00
Thomas Walpole
b5d4dd47de Ensure that 'ActionController::Parameters' can still be passed to AR for collection associations 2015-07-18 08:23:52 -07:00
Sean Griffin
7550f0a016 Ensure cyclic associations w/ autosave don't cause duplicate errors
This code is so fucked. Things that cause this bug not to replicate:

- Defining the validation before the association (we end up calling
  `uniq!` on the errors in the autosave validation)
- Adding `accepts_nested_attributes_for` (I have no clue why. The only
  thing it does that should affect this is adds `autosave: true` to the
  inverse reflection, and doing that manually doesn't fix this).

This solution is a hack, and I'm almost certain there's a better way to
go about it, but this shouldn't cause a huge hit on validation times,
and is the simplest way to get it done.

Fixes #20874.
2015-07-18 10:30:58 -04:00
Sean Griffin
68af636182 Ensure that ActionController::Parameters can still be passed to AR
Since nested hashes are also instances of
`ActionController::Parameters`, and we're explicitly looking to work
with a hash for nested attributes, this caused breakage in several
points.

This is the minimum viable fix for the issue (and one that I'm not
terribly fond of). I can't think of a better place to handle this at the
moment. I'd prefer to use some sort of solution that doesn't special
case AC::Parameters, but we can't use something like `to_h` or `to_a`
since `Enumerable` adds both.

While I've added a trivial test case for verifying this fix in
isolation, we really need better integration coverage to prevent
regressions like this in the future. We don't actually have a lot of
great places for integration coverage at the moment, so I'm deferring it
for now.

Fixes #20922.
2015-07-18 08:44:24 -04:00
Andrii Ponomarov
a8e11ff528 [ci skip] Fix typo in #any? RDoc 2015-07-17 21:03:49 -04:00
Prem Sichanugrist
b5b8979621 Silence deprecation warning from force reload
We deprecate the support for passing an argument to force reload in
6eae366d0d2e5d5211eeaf955f56bd1dc6836758. That led to several
deprecation warning when running Active Record test suite.

This commit silence the warnings by properly calling `#reload` on the
association proxy or on the association object instead. However, there
are several places that `ActiveSupport::Deprecation.silence` are used as
those tests actually tests the force reload functionality and will be
removed once `master` is targeted next minor release (5.1).
2015-07-16 16:06:26 -04:00