Hi -- On Thu, 2 Nov 2006, Wilson Bilkovich wrote: > On 11/1/06, dblack / wobblini.net <dblack / wobblini.net> wrote: >> Hi -- >> >> On Thu, 2 Nov 2006, ara.t.howard / noaa.gov wrote: >> >> > On Thu, 2 Nov 2006 dblack / wobblini.net wrote: >> > >> >> It was recently noted on the Rails mailing list that something like >> >> that happens in ActiveRecord. Given Person and Address models, where >> >> Person has_one Address: >> >> >> >> a = person.address >> >> person.address = Address.find(some_other_address) >> >> puts a # a has changed! >> >> >> >> I find it un-Rubyish and disconcerting (though I'm still waiting for >> >> someone to explain the rationale; there may be something I'm missing). >> > >> > can you show an example? are you saying that activerecord avoids >> apparent >> > copy-on-write semantics with some trickery? >> >> Here's an example from a program which models Ideas; each Idea belongs >> to a Page. >> >> >> i = Idea.find(6) >> => #<Idea:0xb79eec2c @attributes={"page_id"=>"6", "id"=>"6", >> "content"=>"Go to Paris"}> >> >> # Save the idea's page in p >> >> p = i.page >> => #<Page:0xb79e4a88 @attributes={"scratchpad_id"=>"6", >> "title"=>"Domestic travel", "id"=>"6"}> >> >> # Change the idea's page to a different one >> >> i.page = Page.find(7) >> => #<Page:0xb79d1b18 @attributes={"scratchpad_id"=>"1", >> "title"=>"Foreign travel", "id"=>"7"}> >> >> # Examine the saved page -- it's the new one >> >> p >> => #<Page:0xb79d1b18 @attributes={"scratchpad_id"=>"1", >> "title"=>"Foreign travel", "id"=>"7"}> >> >> I don't know the rationale. When I (think I'm) assign(ing) an object >> to a variable, I really don't want it to turn out that it's some >> special arrangement whereby the variable is subject to reassignment >> without notice. I expect: >> >> p = i.page >> >> to be exactly equivalent to: >> >> p = Idea.find(i.page.id) >> >> with respect to p. >> > > I must be missing something. Isn't this how virtually all Ruby code works? > > class Foo > attr_accessor :bar > end > > f = Foo.new > f.bar = "some_string" > > p = f.bar > f.bar << " and how!" > puts p > > What makes the Rails version of this unexpected? I'm not modifying an object in place, though; I'm doing a new assignment. Or at least that's what it appears to be: i.page = Page.find(7) So it's more like: a = "str" b = a a = "new str" puts b # new str I (strongly) believe that the assignment-like syntax should not be rigged to do this. David -- David A. Black | dblack / wobblini.net Author of "Ruby for Rails" [1] | Ruby/Rails training & consultancy [3] DABlog (DAB's Weblog) [2] | Co-director, Ruby Central, Inc. [4] [1] http://www.manning.com/black | [3] http://www.rubypowerandlight.com [2] http://dablog.rubypal.com | [4] http://www.rubycentral.org