Commit Graph

669 Commits

Author SHA1 Message Date
Rafael Mendonça França
cf15e027b9 Improve CHANGELOG entry [ci skip] 2013-12-19 19:53:26 -02:00
Cody Cutrer
847e9a95da fix default select when from is used 2013-12-19 14:40:13 -07:00
Kuldeep Aggarwal
b082bece5e Fix PostgreSQL insert to properly extract table name from multiline string SQL.
Previously, executing an insert SQL in PostgreSQL with a command like this:

    insert into articles(
      number)
    values(
      5152
    )

would not work because the adapter was unable to extract the correct articles table name.
2013-12-19 18:46:17 +05:30
Lauro Caetano
d4ee09cda1 Create a blacklist to disallow mutator methods to be delegated to Array.
This change was necessary because the whitelist wouldn't work.
It would be painful for users trying to update their applications.

This blacklist intent to prevent odd bugs and confusion in code that call mutator
methods directely on the `Relation`.
2013-12-17 13:43:10 -02:00
Martin Emde
8062a30794 Better support for where() conditions that use an association name.
Using the name of an association in `where` previously worked only
if the value was a single `ActiveRecrd::Base` object. e.g.

    Post.where(author: Author.first)

Any other values, including `nil`, would cause invalid SQL to be
generated. This change supports arguments in the `where` query
conditions where the key is a `belongs_to` association name and the
value is `nil`, an `Array` of `ActiveRecord::Base` objects, or an
`ActiveRecord::Relation` object.

    # Given the Post model
    class Post < ActiveRecord::Base
      belongs_to :author
    end

    # nil value finds records where the association is not set
    Post.where(author: nil)
    # SELECT "posts".* FROM "posts" WHERE "posts"."author_id" IS NULL

    # Array values find records where the association foreign key
    # matches the ids of the passed ActiveRecord models, resulting
    # in the same query as Post.where(author_id: [1,2])
    authors_array = [Author.find(1), Author.find(2)]
    Post.where(author: authors_array)

    # ActiveRecord::Relation values find records using the same
    # query as Post.where(author_id: Author.where(last_name: "Emde"))
    Post.where(author: Author.where(last_name: "Emde"))

Polymorphic `belongs_to` associations will continue to be handled
appropriately, with the polymorphic `association_type` field added
to the query to match the base class of the value. This feature
previously only worked when the value was a single `ActveRecord::Base`.

    class Post < ActiveRecord::Base
      belongs_to :author, polymorphic: true
    end

    Post.where(author: Author.where(last_name: "Emde"))
    # Generates a query similar to:
    Post.where(author_id: Author.where(last_name: "Emde"), author_type: "Author")
2013-12-16 14:16:15 -08:00
Rafael Mendonça França
89c46aaaab Improve CHANGELOG entry with examples [ci skip] 2013-12-15 17:07:44 -02:00
Rafael Mendonça França
a09659d59d Merge pull request #13313 from ccutrer/temp-tables
support creating temporary tables from queries

Conflicts:
	activerecord/CHANGELOG.md
2013-12-15 17:07:31 -02:00
Rafael Mendonça França
d150387a38 Improve the CHANGELOG entry [ci skip] 2013-12-15 16:46:12 -02:00
Arthur Neves
b3a806b7b2 db:test:clone and prepare must load environment
db:test:clone and db:test:prepare use
ActiveRecord::Base. configurations, so we need to load the rails
environment, otherwise the config wont be in place.
2013-12-14 17:33:50 -05:00
Cody Cutrer
75a2e4a8df support creating temporary tables from queries
also override drop_table in AbstractMySQLAdapter to properly drop
temporary tables without committing the transaction
2013-12-14 07:07:10 -07:00
laurocaetano
e87c3da2a2 Add changelog 2013-12-12 19:34:47 -02:00
Carlos Antonio da Silva
fe24f3560a Changelog improvements [ci skip] 2013-12-12 08:33:46 -02:00
Paul Nikitochkin
2a7fe7ae9b Fix type cast on group sum with custom expression
For PG adapters with custom expression and grouped result
of aggregate functions have not found correct column type
for it. Extract column type from query result.

Closes: #13230
2013-12-10 14:30:12 +02:00
Carlos Antonio da Silva
b372690b78 Improve AR changelog [ci skip] 2013-12-05 19:30:43 -02:00
Severin Schoepke
f1a646fa74 polymorphic belongs_to association with touch: true updates old record correctly
Example: Given you have a comments model with a polymorphic commentable
association (e.g. books and songs) with the touch option set.
Every time you update a comment its commentable should be touched.
This was working when you changed attributes on the comment or when you
moved the comment from one book to another. However, it was not working
when moving a comment from a book to a song. This is now fixed.
2013-12-05 16:03:07 +01:00
Yves Senn
64c784f553 end sentences with a .. [ci skip] 2013-12-05 11:33:12 +01:00
Carlos Antonio da Silva
0b35a0d762 Improve AR changelog, add entry for migration error improvements #12462 [ci skip] 2013-12-03 18:16:32 -02:00
Lauro Caetano
2a517e7291 Fix offset with last.
Closes #7441
2013-12-03 17:09:58 -02:00
Yves Senn
be5527b8e8 connection.type_to_sql returns a String for unmapped types.
Closes #13146.

This fixes an error when using:

```
change_colum :table, :column, :bigint, array: true
```
2013-12-03 17:54:25 +01:00
Vipul A M
1ed81e85ca Currently, we clear query_cache in cache block finish, even if we may already have cache true.
This commit takes into account the last cache_enabled value, before clearing query_cache.
2013-12-03 17:48:14 +05:30
Victor Costan
ddf27acbc2 Introduce a context for rendering fixtures ERB.
Fixture files are passed through an ERB renderer before being read as
YAML. The rendering is currently done in the context of the main object,
so method definitons leak into other fixtures, and there is no clean
place to define fixture helpers.

After this commit, the ERB renderer will use a new subclass of
ActiveRecord::FixtureSet.context_class each time a fixture is rendered.
2013-12-03 02:52:26 -05:00
Carlos Antonio da Silva
a2dad133d9 Improve AR changelog [ci skip] 2013-11-30 13:35:28 -02:00
Godfrey Chan
35fd2d4019 Raise ArgumentError when has_one is used with counter_cache
Previously, the `has_one` macro incorrectly accepts the `counter_cache` option
due to a bug, although that options was never supported nor functional on
`has_one` and `has_one ... through` relationships. It now correctly raises an
`ArgumentError` when passed that option.

For reference, this bug was introduced in 52f8e4b9.
2013-11-29 19:21:49 -08:00
Cody Cutrer
664c7bb361 fix mysql version check in rename_index
also clarify native rename_index support is >= 5.7, not > 5.7
2013-11-28 19:42:11 -07:00
Cody Cutrer
a9771ddba5 implement rename_index natively for MySQL > 5.7 2013-11-28 11:10:59 -07:00
Yves Senn
7c6d99e81e first pass through CHANGELOGS to extract 4_1_release_notes. [ci skip]
Extract **notable changes**, **deprecations** and **removals** from
each CHANGELOG.

I tried to reference the commits and pull requests for new features
and deprecations.

In the process I also made some minor changes to the CHANGELOGS.

The 4_1_release_notes guide is declared WIP.
2013-11-28 17:24:15 +01:00
Rafael Mendonça França
5fdbec7dd1 Merge pull request #13061 from laurocaetano/fix-uniqueness-validation-for-aliased-attribute
Fix bug when validating the uniqueness of an aliased attribute.
Conflicts:
	activerecord/CHANGELOG.md
2013-11-26 20:54:19 -02:00
heruku
45d4d141f9 changed update counter to act on unscoped model 2013-11-26 09:04:03 -06:00
Yves Senn
6eba8d27e6 rename_index: add the new index before removing the old one.
This prevents the following error when a MySQL index on a foreign key
column is renamed:

```
ActiveRecord::StatementInvalid: Mysql2::Error: Cannot drop index 'index_engines_on_car_id': needed in a foreign key constraint: DROP INDEX `index_engines_on_car_id` ON `engines`
```

refs: #13038.
2013-11-26 10:03:55 +01:00
Brian Thomas Storti
09f941c507 move changelog entry to the top 2013-11-25 23:17:31 -02:00
Brian Thomas Storti
5aab0c0538 Raise RecordNotDestroyed when children can't be replaced
Fixes #12812
Raise `ActiveRecord::RecordNotDestroyed` when a child marked with
`dependent: destroy` can't be destroyed.

The following code:
```ruby
class Post < ActiveRecord::Base
  has_many :comments, dependent: :destroy
end

class Comment < ActiveRecord::Base
  before_destroy do
    return false
  end
end

post = Post.create!(comments: [Comment.create!])
post.comments = [Comment.create!]
````

would result in a `post` with two `comments`.
With this commit, the same code would raise a `RecordNotDestroyed`
exception, keeping the `post` with the same `comment`.
2013-11-25 19:30:07 -02:00
Vipul A M
82de1eda7c Fix some minor typos [ci skip] 2013-11-26 00:13:35 +05:30
Evgeny Li
c449a74e89 Fix validation on uniqueness of empty association 2013-11-22 22:22:34 +04:00
Carlos Antonio da Silva
18964368f3 Improve changelogs
Also make Action Mailer changelog format more consistent with the
others [ci skip]
2013-11-22 08:30:04 -02:00
Jon Leighton
64b9e93bb5 Fix ActiveRecord::Relation#unscope
I'm pretty confused about the addition of this method. The documentation
says that it was intended to allow the removal of values from the
default scope (in contrast to #except). However it behaves exactly the
same as except: https://gist.github.com/jonleighton/7537008 (other than
having a slightly enhanced syntax).

The removal of the default scope is allowed by
94924dc32baf78f13e289172534c2e71c9c8cade, which was not a change we
could make until 4.1 due to the need to deprecate things. However after
that change #unscope still gives us nothing that #except doesn't already
give us.

However there *is* a desire to be able to unscope stuff in a way that
persists across merges, which would allow associations to be defined
which unscope stuff from the default scope of the associated model. E.g.

  has_many :comments, -> { unscope where: :trashed }

So that's what this change implements. I've also corrected the
documentation. I removed the guide references to #except as I think
unscope really supercedes #except now.

While we're here, there's also a potential desire to be able to write
this:

  has_many :comments, -> { unscoped }

However, it doesn't make sense and would not be straightforward to
implement. While with #unscope we're specifying exactly what we want to
be removed from the relation, with "unscoped" we're just saying that we
want it to not have some things which were added earlier on by the
default scope. However in the case of an association, we surely don't
want *all* conditions to be removed, otherwise the above would just
become "SELECT * FROM comments" with no foreign key constraint.

To make the above work, we'd have to somehow tag the relation values
which get added when evaluating the default scope in order to
differentiate them from other relation values. Which is way too much
complexity and therefore not worth it when most use cases can be
satisfied with unscope.

Closes #10643, #11061.
2013-11-20 22:23:16 +00:00
Yves Senn
f83c9b10b4 use arel nodes to represent non-string order_values.
This fixes a bug when merging relations of different classes.

```
Given:
  Post.joins(:author).merge(Author.order(name: :desc)).to_sql

Before:
 SELECT "posts".* FROM "posts"
   INNER JOIN "authors" ON "authors"."id" = "posts"."author_id"
   ORDER BY "posts"."name" DESC

After:
 SELECT "posts".* FROM "posts"
   INNER JOIN "authors" ON "authors"."id" = "posts"."author_id"
   ORDER BY "authors"."name" DESC
```
2013-11-19 17:40:21 +01:00
Rafael Mendonça França
728096542a Revert "Explicitly exit with status "1" for create and drop failures"
This reverts commit 22f80ae57b26907f662b7fd50a7270a6381e527e.

See
22f80ae57b (commitcomment-4640676)

Conflicts:
	activerecord/CHANGELOG.md
2013-11-19 13:07:28 -02:00
Rafael Mendonça França
c069e0fa34 Merge pull request #12918 from versioncontrol/rails-12866
Checks to see if the record contains the foreign_key to set the inverse automatically

Conflicts:
	activerecord/CHANGELOG.md
2013-11-16 18:28:03 -02:00
Edo Balvers
02ca5580bd Checks to see if the record contains the foreign_key to set the inverse automatically 2013-11-16 21:18:02 +01:00
Rafael Mendonça França
8c66623627 Merge pull request #12531 from iamvery/database-tasks-exit-status
Explicitly exit with status "1" for create and drop task failures

Conflicts:
	activerecord/CHANGELOG.md
2013-11-15 16:59:29 -02:00
Carlos Antonio da Silva
6cad0e317b Fix AR Changelog examples and improve syntax highlight [ci skip] 2013-11-14 23:45:30 -02:00
Javan Makhmali
547999df25 Add AR::Base.to_param for convenient "pretty" URLs derived from a model's attribute or method. 2013-11-14 13:38:08 -05:00
Damien Mathieu
b32ba367f5 add #no_touching on ActiveRecord models 2013-11-13 08:42:38 +01:00
dm1try
dbb7ee1bfd Prevent the counter cache from being decremented twice
when destroying a record on a has_many :through association.
:destroy method has own counter_cache callbacks.
2013-11-11 19:53:02 +03:00
Yves Senn
07ae1e9b55 Unifies mysql and mysql2 casting of booleans. 2013-11-11 16:15:00 +01:00
Jay Hayes
22f80ae57b Explicitly exit with status "1" for create and drop failures
* A non-zero exit status allows subsequent shell commands to be chained
  together such as: `rake db:reset test:prepare && rspec && cap deploy`
  (if you're feeling brave :)
* Any exceptions raised during the `create` and `drop` tasks are caught
  in order to print a "pretty" message to the user. Unfortunately doing
  so prevents rake from aborting with a non-zero exit status to the shell.
* Therefore we re-raise the exceptions after the "pretty" message and
  re-catch them in the task.
* From the task we explicitly exit with a non-zero status. This method
  was chosen (rather than just letting rake fail from the exception) so
  that the backtrace is suppressed and the output to stderr is
  unchanged.
* Update activerecord CHANGELOG
2013-11-11 07:54:30 -06:00
Yves Senn
db56c0fcf5 tidy Active Record CHANGELOG. [ci skip]. 2013-11-11 12:03:36 +01:00
Denis Redozubov
3ed5642e69 Fixes problem with replacing has_one association record with itself 2013-11-11 14:19:12 +04:00
Carlos Antonio da Silva
5deec016fe Improve changelogs formatting [ci skip] 2013-11-09 16:44:58 -02:00
Yves Senn
97f0d9a0dd log bind variables after they were type casted.
The log output used to be confusing in situation where type casting has
"unexpected" effects. For example when finding records with a `String`.

BEFORE:

irb(main):002:0> Event.find("im-no-integer")
D, [2013-11-09T11:10:28.998857 #1706] DEBUG -- :   Event Load (4.5ms)  SELECT "events".* FROM "events" WHERE "events"."id" = $1 LIMIT 1  [["id", "im-no-integer"]]

AFTER:

irb(main):002:0> Event.find("im-no-integer")
D, [2013-11-09T11:10:28.998857 #1706] DEBUG -- :   Event Load (4.5ms)  SELECT "events".* FROM "events" WHERE "events"."id" = $1 LIMIT 1  [["id", 0]]
2013-11-09 11:23:34 +01:00