diff --git a/activerecord/lib/active_record/associations.rb b/activerecord/lib/active_record/associations.rb
old mode 100644
new mode 100755
index 95caf68692..6c21fed8ea
--- a/activerecord/lib/active_record/associations.rb
+++ b/activerecord/lib/active_record/associations.rb
@@ -667,7 +667,7 @@ module ActiveRecord
# * :limit - An integer determining the limit on the number of rows that should be returned.
# * :offset - An integer determining the offset from where the rows should be fetched. So at 5, it would skip the first 4 rows.
# * :select - By default, this is * as in SELECT * FROM, but can be changed if you, for example, want to do a join
- # but not include the joined columns.
+ # but not include the joined columns. Do not forget to include the primary and foreign keys, otherwise it will rise an error.
# * :as - Specifies a polymorphic interface (See belongs_to).
# * :through - Specifies a Join Model through which to perform the query. Options for :class_name and :foreign_key
# are ignored, as the association uses the source reflection. You can only use a :through query through a belongs_to
@@ -747,6 +747,8 @@ module ActiveRecord
# as the default :foreign_key.
# * :include - Specify second-order associations that should be eager loaded when this object is loaded.
# * :as - Specifies a polymorphic interface (See belongs_to).
+ # * :select - By default, this is * as in SELECT * FROM, but can be changed if, for example, you want to do a join
+ # but not include the joined columns. Do not forget to include the primary and foreign keys, otherwise it will raise an error.
# * :through: Specifies a Join Model through which to perform the query. Options for :class_name and :foreign_key
# are ignored, as the association uses the source reflection. You can only use a :through query through a
# has_one or belongs_to association on the join model.
@@ -821,8 +823,8 @@ module ActiveRecord
# if the real class name is Person, you'll have to specify it with this option.
# * :conditions - Specify the conditions that the associated object must meet in order to be included as a +WHERE+
# SQL fragment, such as authorized = 1.
- # * :order - Specify the order in which the associated objects are returned as an ORDER BY SQL fragment,
- # such as last_name, first_name DESC.
+ # * :select - By default, this is * as in SELECT * FROM, but can be changed if, for example, you want to do a join
+ # but not include the joined columns. Do not forget to include the primary and foreign keys, otherwise it will raise an error.
# * :foreign_key - Specify the foreign key used for the association. By default this is guessed to be the name
# of the association with an "_id" suffix. So a class that defines a belongs_to :person association will use
# "person_id" as the default :foreign_key. Similarly, belongs_to :favorite_person, :class_name => "Person"
@@ -1011,7 +1013,7 @@ module ActiveRecord
# * :limit - An integer determining the limit on the number of rows that should be returned.
# * :offset - An integer determining the offset from where the rows should be fetched. So at 5, it would skip the first 4 rows.
# * :select - By default, this is * as in SELECT * FROM, but can be changed if, for example, you want to do a join
- # but not include the joined columns.
+ # but not include the joined columns. Do not forget to include the primary and foreign keys, otherwise it will raise an error.
# * :readonly - If true, all the associated objects are readonly through the association.
#
# Option examples:
@@ -1341,7 +1343,7 @@ module ActiveRecord
def create_has_one_reflection(association_id, options)
options.assert_valid_keys(
- :class_name, :foreign_key, :remote, :conditions, :order, :include, :dependent, :counter_cache, :extend, :as, :readonly
+ :class_name, :foreign_key, :remote, :select, :conditions, :order, :include, :dependent, :counter_cache, :extend, :as, :readonly
)
create_reflection(:has_one, association_id, options, self)
@@ -1349,14 +1351,14 @@ module ActiveRecord
def create_has_one_through_reflection(association_id, options)
options.assert_valid_keys(
- :class_name, :foreign_key, :remote, :conditions, :order, :include, :dependent, :counter_cache, :extend, :as, :through, :source, :source_type
+ :class_name, :foreign_key, :remote, :select, :conditions, :order, :include, :dependent, :counter_cache, :extend, :as, :through, :source, :source_type
)
create_reflection(:has_one, association_id, options, self)
end
def create_belongs_to_reflection(association_id, options)
options.assert_valid_keys(
- :class_name, :foreign_key, :foreign_type, :remote, :conditions, :order, :include, :dependent,
+ :class_name, :foreign_key, :foreign_type, :remote, :select, :conditions, :include, :dependent,
:counter_cache, :extend, :polymorphic, :readonly
)
diff --git a/activerecord/lib/active_record/associations/belongs_to_association.rb b/activerecord/lib/active_record/associations/belongs_to_association.rb
old mode 100644
new mode 100755
index 9ff3f13592..7c28cbdd07
--- a/activerecord/lib/active_record/associations/belongs_to_association.rb
+++ b/activerecord/lib/active_record/associations/belongs_to_association.rb
@@ -42,10 +42,11 @@ module ActiveRecord
private
def find_target
@reflection.klass.find(
- @owner[@reflection.primary_key_name],
+ @owner[@reflection.primary_key_name],
+ :select => @reflection.options[:select],
:conditions => conditions,
:include => @reflection.options[:include],
- :readonly => @reflection.options[:readonly]
+ :readonly => @reflection.options[:readonly]
)
end
diff --git a/activerecord/lib/active_record/associations/belongs_to_polymorphic_association.rb b/activerecord/lib/active_record/associations/belongs_to_polymorphic_association.rb
old mode 100644
new mode 100755
index 9549b959fc..df4ae38f38
--- a/activerecord/lib/active_record/associations/belongs_to_polymorphic_association.rb
+++ b/activerecord/lib/active_record/associations/belongs_to_polymorphic_association.rb
@@ -29,12 +29,13 @@ module ActiveRecord
if @reflection.options[:conditions]
association_class.find(
- @owner[@reflection.primary_key_name],
+ @owner[@reflection.primary_key_name],
+ :select => @reflection.options[:select],
:conditions => conditions,
:include => @reflection.options[:include]
)
else
- association_class.find(@owner[@reflection.primary_key_name], :include => @reflection.options[:include])
+ association_class.find(@owner[@reflection.primary_key_name], :select => @reflection.options[:select], :include => @reflection.options[:include])
end
end
diff --git a/activerecord/lib/active_record/associations/has_one_association.rb b/activerecord/lib/active_record/associations/has_one_association.rb
old mode 100644
new mode 100755
index 3ff9fe3b9f..c2b3503e0d
--- a/activerecord/lib/active_record/associations/has_one_association.rb
+++ b/activerecord/lib/active_record/associations/has_one_association.rb
@@ -51,10 +51,11 @@ module ActiveRecord
private
def find_target
@reflection.klass.find(:first,
- :conditions => @finder_sql,
+ :conditions => @finder_sql,
+ :select => @reflection.options[:select],
:order => @reflection.options[:order],
:include => @reflection.options[:include],
- :readonly => @reflection.options[:readonly]
+ :readonly => @reflection.options[:readonly]
)
end
diff --git a/activerecord/test/cases/associations/belongs_to_associations_test.rb b/activerecord/test/cases/associations/belongs_to_associations_test.rb
old mode 100644
new mode 100755
index 4382ba17ef..3073eae355
--- a/activerecord/test/cases/associations/belongs_to_associations_test.rb
+++ b/activerecord/test/cases/associations/belongs_to_associations_test.rb
@@ -92,6 +92,11 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
assert_not_nil Company.find(3).firm_with_condition, "Microsoft should have a firm"
end
+ def test_with_select
+ assert_equal Company.find(2).firm_with_select.attributes.size, 1
+ assert_equal Company.find(2, :include => :firm_with_select ).firm_with_select.attributes.size, 1
+ end
+
def test_belongs_to_counter
debate = Topic.create("title" => "debate")
assert_equal 0, debate.send(:read_attribute, "replies_count"), "No replies yet"
diff --git a/activerecord/test/cases/associations/has_one_associations_test.rb b/activerecord/test/cases/associations/has_one_associations_test.rb
old mode 100644
new mode 100755
index 9e99caa7b7..e7d4de8246
--- a/activerecord/test/cases/associations/has_one_associations_test.rb
+++ b/activerecord/test/cases/associations/has_one_associations_test.rb
@@ -24,6 +24,11 @@ class HasOneAssociationsTest < ActiveRecord::TestCase
assert_queries(0) { firms.each(&:account) }
end
+ def test_with_select
+ assert_equal Firm.find(1).account_with_select.attributes.size, 2
+ assert_equal Firm.find(1, :include => :account_with_select).attributes.size, 2
+ end
+
def test_can_marshal_has_one_association_with_nil_target
firm = Firm.new
assert_nothing_raised do
diff --git a/activerecord/test/models/company.rb b/activerecord/test/models/company.rb
index f637490c59..cc521d2a02 100755
--- a/activerecord/test/models/company.rb
+++ b/activerecord/test/models/company.rb
@@ -47,6 +47,7 @@ class Firm < Company
has_many :readonly_clients, :class_name => 'Client', :readonly => true
has_one :account, :foreign_key => "firm_id", :dependent => :destroy
+ has_one :account_with_select, :foreign_key => "firm_id", :select => "id, firm_id"
has_one :readonly_account, :foreign_key => "firm_id", :class_name => "Account", :readonly => true
end
@@ -64,6 +65,7 @@ end
class Client < Company
belongs_to :firm, :foreign_key => "client_of"
belongs_to :firm_with_basic_id, :class_name => "Firm", :foreign_key => "firm_id"
+ belongs_to :firm_with_select, :class_name => "Firm", :foreign_key => "firm_id", :select => "id"
belongs_to :firm_with_other_name, :class_name => "Firm", :foreign_key => "client_of"
belongs_to :firm_with_condition, :class_name => "Firm", :foreign_key => "client_of", :conditions => ["1 = ?", 1]
belongs_to :readonly_firm, :class_name => "Firm", :foreign_key => "firm_id", :readonly => true