1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

HABTM finder sets :readonly => false. Closes #2525.

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@2694 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
Jeremy Kemper 2005-10-20 14:53:04 +00:00
parent 07bff0b535
commit 7219e82fe6
4 changed files with 32 additions and 17 deletions

View file

@ -1,5 +1,7 @@
*1.12.1* (October 19th, 2005)
* HABTM finders shouldn't return readonly records. #2525 [patrick@lenz.sh]
* Make all tests runnable on their own. #2521. [Blair Zajac <blair@orcaware.com>]
* Always parenthesize :conditions options so they may be safely combined with STI and constraints.

View file

@ -45,6 +45,7 @@ module ActiveRecord
end
options[:conditions] = conditions
options[:joins] = @join_sql
options[:readonly] ||= false
if options[:order] && @options[:order]
options[:order] = "#{options[:order]}, #{@options[:order]}"

View file

@ -357,7 +357,7 @@ module ActiveRecord #:nodoc:
# * <tt>:offset</tt>: An integer determining the offset from where the rows should be fetched. So at 5, it would skip the first 4 rows.
# * <tt>:joins</tt>: An SQL fragment for additional joins like "LEFT JOIN comments ON comments.post_id = id". (Rarely needed).
# The records will be returned read-only since they will have attributes that do not correspond to the table's columns.
# Use <tt>find_by_sql</tt> to circumvent this limitation.
# Pass :readonly => false to override.
# * <tt>:include</tt>: Names associations that should be loaded alongside using LEFT OUTER JOINs. The symbols named refer
# to already defined associations. See eager loading under Associations.
# * <tt>:select</tt>: By default, this is * as in SELECT * FROM, but can be changed if you for example want to do a join, but not
@ -384,8 +384,10 @@ module ActiveRecord #:nodoc:
def find(*args)
options = extract_options_from_args!(args)
# :joins implies :readonly => true
options[:readonly] = true if options[:joins]
# :joins implies :readonly => true if unset.
if options[:joins] and !options.has_key?(:readonly)
options[:readonly] = true
end
case args.first
when :first

View file

@ -1,31 +1,41 @@
require 'abstract_unit'
require 'fixtures/topic'
require 'fixtures/developer'
require 'fixtures/project'
class ReadOnlyTest < Test::Unit::TestCase
fixtures :topics
fixtures :developers, :projects, :developers_projects
def test_cant_save_readonly_record
topic = Topic.find(:first)
assert !topic.readonly?
dev = Developer.find(:first)
assert !dev.readonly?
topic.readonly!
assert topic.readonly?
dev.readonly!
assert dev.readonly?
assert_nothing_raised do
topic.content = 'Luscious forbidden fruit.'
dev.name = 'Luscious forbidden fruit.'
assert !dev.save
dev.name = 'Forbidden.'
end
assert_raise(ActiveRecord::ReadOnlyRecord) { topic.save }
assert_raise(ActiveRecord::ReadOnlyRecord) { topic.save! }
assert_raise(ActiveRecord::ReadOnlyRecord) { dev.save }
assert_raise(ActiveRecord::ReadOnlyRecord) { dev.save! }
end
def test_find_with_readonly_option
Topic.find(:all).each { |t| assert !t.readonly? }
Topic.find(:all, :readonly => false).each { |t| assert !t.readonly? }
Topic.find(:all, :readonly => true).each { |t| assert t.readonly? }
Developer.find(:all).each { |d| assert !d.readonly? }
Developer.find(:all, :readonly => false).each { |d| assert !d.readonly? }
Developer.find(:all, :readonly => true).each { |d| assert d.readonly? }
end
def test_find_with_joins_option_implies_readonly
Topic.find(:all, :joins => '').each { |t| assert t.readonly? }
Developer.find(:all, :joins => '').each { |d| assert d.readonly? }
Developer.find(:all, :joins => '', :readonly => false).each { |d| assert !d.readonly? }
end
def test_habtm_find_readonly
dev = Developer.find(:first)
dev.projects.each { |p| assert !p.readonly? }
dev.projects.find(:all) { |p| assert !p.readonly? }
dev.projects.find(:all, :readonly => true) { |p| assert p.readonly? }
end
end