From 302c23d5a6c1df4a5a9f373e545db5f8a894bdd6 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sat, 25 Jun 2005 11:47:37 +0000 Subject: Fixed Base#find to honor the documentation on how :joins work and make them consistent with Base#count #1405 [pritchie@gmail.com] Improved dynamic finder docs #1495 [laurel@gorgorg.org] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@1510 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- activerecord/CHANGELOG | 12 ++++++++++++ activerecord/lib/active_record/base.rb | 10 ++++++---- activerecord/test/finder_test.rb | 7 +++++-- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG index c7526beb83..5d2734cfa2 100644 --- a/activerecord/CHANGELOG +++ b/activerecord/CHANGELOG @@ -1,5 +1,17 @@ *SVN* +* Fixed Base#find to honor the documentation on how :joins work and make them consistent with Base#count #1405 [pritchie@gmail.com]. What used to be: + + Developer.find :all, :joins => 'developers_projects', :conditions => 'id=developer_id AND project_id=1' + + ...should instead be: + + Developer.find( + :all, + :joins => 'LEFT JOIN developers_projects ON developers.id = developers_projects.developer_id', + :conditions => 'project_id=1' + ) + * Fixed that validations didn't respecting custom setting for too_short, too_long messages #1437 [Marcel Molina] * Fixed that clear_association_cache doesn't delete new associations on new records (so you can safely place new records in the session with Action Pack without having new associations wiped) #1494 [cluon] diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb index 2d4501e678..5535f224c8 100755 --- a/activerecord/lib/active_record/base.rb +++ b/activerecord/lib/active_record/base.rb @@ -135,9 +135,11 @@ module ActiveRecord #:nodoc: # # == Dynamic attribute-based finders # - # Dynamic attribute-based finders are a cleaner way of getting objects by simple queries without turning to SQL. They work by - # appending the name of an attribute to find_by_, so you get finders like Person.find_by_user_name, Payment.find_by_transaction_id. - # So instead of writing Person.find(:first, ["user_name = ?", user_name]), you just do Person.find_by_user_name(user_name). + # Dynamic attribute-based finders are a cleaner way of getting objects by simple queries without turning to SQL. They work by + # appending the name of an attribute to find_by_ or find_all_by_, so you get finders like Person.find_by_user_name, + # Person.find_all_by_last_name, Payment.find_by_transaction_id. So instead of writing + # Person.find(:first, ["user_name = ?", user_name]), you just do Person.find_by_user_name(user_name). + # And instead of writing Person.find(:all, ["last_name = ?", last_name]), you just do Person.find_all_by_last_name(last_name). # # It's also possible to use multiple attributes in the same find by separating them with "_and_", so you get finders like # Person.find_by_user_name_and_password or even Payment.find_by_purchaser_and_state_and_country. So instead of writing @@ -737,7 +739,7 @@ module ActiveRecord #:nodoc: def construct_finder_sql(options) sql = "SELECT * FROM #{table_name} " - sql << ", #{options[:joins]} " if options[:joins] + sql << " #{options[:joins]} " if options[:joins] add_conditions!(sql, options[:conditions]) sql << "ORDER BY #{options[:order]} " if options[:order] add_limit!(sql, options) diff --git a/activerecord/test/finder_test.rb b/activerecord/test/finder_test.rb index 06c5229433..1ac97271eb 100644 --- a/activerecord/test/finder_test.rb +++ b/activerecord/test/finder_test.rb @@ -292,8 +292,11 @@ class FinderTest < Test::Unit::TestCase end def test_find_all_with_join - developers_on_project_one = Developer.find :all, :joins => 'developers_projects', :conditions => 'id=developer_id AND project_id=1' - + developers_on_project_one = Developer.find( + :all, + :joins => 'LEFT JOIN developers_projects ON developers.id = developers_projects.developer_id', + :conditions => 'project_id=1' + ) assert_equal 2, developers_on_project_one.length developer_names = developers_on_project_one.map { |d| d.name } assert developer_names.include?('David') -- cgit v1.2.3