______________ ALIEN8 RECORDINGS P.O. BOX 666, STATION R MONTREAL, QC CANADA, H2S 3L1 http://www.alien8recordings.com
First off, apologies about my previous empty post. Also, apologies for the newbie nature of this post. I am new to rails and I''m working on a simple relational database to be administered and accessible to the public through rails. I have a question about aggregation as outlined in the pragprog "agile web development" book, around page 258 to 260. My example is nearly identical to the one used in the book. I have basically followed the example there to the letter, the only difference is that I want to aggregate fields from a model called Author rather than Customer, and one of the field names is different. My question is simply this, once the Author model refers to the new Name model, how can I access the new :name attribute of instances of Author? I tried to do that in a view with the following code: <td><%= author[:name] %></td> It doesn''t return an error, just doesn''t output anything. The book shows how to created a new instance of Customer with the aggregate Name object, but what about instances from a database record? Shouldn''t they have a :name attribute if they have all the attributes that it''s composed of? The code I''ve used for Author and Name models is below. Thanks in advance for any info on where I''m going wrong. *** app/models/author.rb *** class Author < ActiveRecord::Base has_and_belongs_to_many :books validates_presence_of :first_name, :last_name # composed_of declaration maps Author attributes to the Name model object composed_of :name, :class_name => Name, :mapping => [ [ :first_name, :first ], [ :other_name, :other], [ :last_name, :last] ] end *** *** app/models/name.rb *** # Class defines the Name object, aggregation of attirbutes of Author # object. class Name attr_reader :first, :other, :last def initialize(first, other, last) @first = first @other = other @last = last end def to_s [ @first, @other, @last ].compact.join(" ") end end
Use: <td><%= author.name %></td> then check out page 203. Cody On 12/6/05, Alien8 Recordings <alien8-Mu2R4EvrfYk2NbfV7ZGCIlaTQe2KTcn/@public.gmane.org> wrote:> First off, apologies about my previous empty post. > > Also, apologies for the newbie nature of this post. I am new to rails > and I''m working on a simple relational database to be administered > and accessible to the public through rails. I have a question about > aggregation as outlined in the pragprog "agile web development" book, > around page 258 to 260. My example is nearly identical to the one > used in the book. I have basically followed the example there to the > letter, the only difference is that I want to aggregate fields from a > model called Author rather than Customer, and one of the field names > is different. > > My question is simply this, once the Author model refers to the new > Name model, how can I access the new :name attribute of instances of > Author? I tried to do that in a view with the following code: <td><%> author[:name] %></td> It doesn''t return an error, just doesn''t output > anything. The book shows how to created a new instance of Customer > with the aggregate Name object, but what about instances from a > database record? Shouldn''t they have a :name attribute if they have > all the attributes that it''s composed of? > > The code I''ve used for Author and Name models is below. Thanks in > advance for any info on where I''m going wrong. > > *** app/models/author.rb *** > class Author < ActiveRecord::Base > > has_and_belongs_to_many :books > validates_presence_of :first_name, :last_name > > # composed_of declaration maps Author attributes to the Name model > object > composed_of :name, > :class_name => Name, > :mapping => > [ [ :first_name, :first ], > [ :other_name, :other], > [ :last_name, :last] > ] > end > *** > > *** app/models/name.rb *** > # Class defines the Name object, aggregation of attirbutes of Author > # object. > class Name > attr_reader :first, :other, :last > > def initialize(first, other, last) > @first = first > @other = other > @last = last > end > > def to_s > [ @first, @other, @last ].compact.join(" ") > end > end > > > _______________________________________________ > Rails mailing list > Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org > http://lists.rubyonrails.org/mailman/listinfo/rails >-- http://www.codyfauser.com
Hey Cody, Sorry, just one more question. I see that you can''t use symbols to access model attributes that are aggregated, but what does one do in the case when one wants to pass them to a method that requires symbols, such as: auto_complete_for :post, :title Thanks, Sean On 6-Dec-05, at 3:47 PM, Cody Fauser wrote:> Use: <td><%= author.name %></td> then check out page 203. > > > > Cody > > On 12/6/05, Alien8 Recordings <alien8-Mu2R4EvrfYk2NbfV7ZGCIlaTQe2KTcn/@public.gmane.org> wrote: >> First off, apologies about my previous empty post. >> >> Also, apologies for the newbie nature of this post. I am new to rails >> and I''m working on a simple relational database to be administered >> and accessible to the public through rails. I have a question about >> aggregation as outlined in the pragprog "agile web development" book, >> around page 258 to 260. My example is nearly identical to the one >> used in the book. I have basically followed the example there to the >> letter, the only difference is that I want to aggregate fields from a >> model called Author rather than Customer, and one of the field names >> is different. >> >> My question is simply this, once the Author model refers to the new >> Name model, how can I access the new :name attribute of instances of >> Author? I tried to do that in a view with the following code: <td><%>> author[:name] %></td> It doesn''t return an error, just doesn''t output >> anything. The book shows how to created a new instance of Customer >> with the aggregate Name object, but what about instances from a >> database record? Shouldn''t they have a :name attribute if they have >> all the attributes that it''s composed of? >> >> The code I''ve used for Author and Name models is below. Thanks in >> advance for any info on where I''m going wrong. >> >> *** app/models/author.rb *** >> class Author < ActiveRecord::Base >> >> has_and_belongs_to_many :books >> validates_presence_of :first_name, :last_name >> >> # composed_of declaration maps Author attributes to the Name model >> object >> composed_of :name, >> :class_name => Name, >> :mapping => >> [ [ :first_name, :first ], >> [ :other_name, :other], >> [ :last_name, :last] >> ] >> end >> *** >> >> *** app/models/name.rb *** >> # Class defines the Name object, aggregation of attirbutes of Author >> # object. >> class Name >> attr_reader :first, :other, :last >> >> def initialize(first, other, last) >> @first = first >> @other = other >> @last = last >> end >> >> def to_s >> [ @first, @other, @last ].compact.join(" ") >> end >> end >> >> >> _______________________________________________ >> Rails mailing list >> Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org >> http://lists.rubyonrails.org/mailman/listinfo/rails >> > > > -- > http://www.codyfauser.com > _______________________________________________ > Rails mailing list > Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org > http://lists.rubyonrails.org/mailman/listinfo/rails > >______________ ALIEN8 RECORDINGS P.O. BOX 666, STATION R MONTREAL, QC CANADA, H2S 3L1 http://www.alien8recordings.com
Sean, It all depends on what you''re doing. The reason auto_complete_for doesn''t work on the aggregate is because it builds the sql where conditions based on the symbol you pass in. Since there isn''t a ''name'' column in your table the query will fail. Click the ''show source'' link on the rdocs for auto_complete_for for more details: http://api.rubyonrails.com/classes/ActionController/Macros/AutoComplete/ClassMethods.html#M000032 Depending on your circumstances you could still access the attributes author.first_name author.last_name. Otherwise, in the case of autocomplete you can check out Thomas Fuchs'' fantastic demos at http://demo.script.aculo.us/, which show a customized autocomplete in action. Cody On 12/6/05, Alien8 Recordings <alien8-Mu2R4EvrfYk2NbfV7ZGCIlaTQe2KTcn/@public.gmane.org> wrote:> Hey Cody, > > Sorry, just one more question. I see that you can''t use symbols to > access model attributes that are aggregated, but what does one do in > the case when one wants to pass them to a method that requires > symbols, such as: > auto_complete_for :post, :title > > Thanks, > Sean > > On 6-Dec-05, at 3:47 PM, Cody Fauser wrote: > > > Use: <td><%= author.name %></td> then check out page 203. > > > > > > > > Cody > > > > On 12/6/05, Alien8 Recordings <alien8-Mu2R4EvrfYk2NbfV7ZGCIlaTQe2KTcn/@public.gmane.org> wrote: > >> First off, apologies about my previous empty post. > >> > >> Also, apologies for the newbie nature of this post. I am new to rails > >> and I''m working on a simple relational database to be administered > >> and accessible to the public through rails. I have a question about > >> aggregation as outlined in the pragprog "agile web development" book, > >> around page 258 to 260. My example is nearly identical to the one > >> used in the book. I have basically followed the example there to the > >> letter, the only difference is that I want to aggregate fields from a > >> model called Author rather than Customer, and one of the field names > >> is different. > >> > >> My question is simply this, once the Author model refers to the new > >> Name model, how can I access the new :name attribute of instances of > >> Author? I tried to do that in a view with the following code: <td><%> >> author[:name] %></td> It doesn''t return an error, just doesn''t output > >> anything. The book shows how to created a new instance of Customer > >> with the aggregate Name object, but what about instances from a > >> database record? Shouldn''t they have a :name attribute if they have > >> all the attributes that it''s composed of? > >> > >> The code I''ve used for Author and Name models is below. Thanks in > >> advance for any info on where I''m going wrong. > >> > >> *** app/models/author.rb *** > >> class Author < ActiveRecord::Base > >> > >> has_and_belongs_to_many :books > >> validates_presence_of :first_name, :last_name > >> > >> # composed_of declaration maps Author attributes to the Name model > >> object > >> composed_of :name, > >> :class_name => Name, > >> :mapping => > >> [ [ :first_name, :first ], > >> [ :other_name, :other], > >> [ :last_name, :last] > >> ] > >> end > >> *** > >> > >> *** app/models/name.rb *** > >> # Class defines the Name object, aggregation of attirbutes of Author > >> # object. > >> class Name > >> attr_reader :first, :other, :last > >> > >> def initialize(first, other, last) > >> @first = first > >> @other = other > >> @last = last > >> end > >> > >> def to_s > >> [ @first, @other, @last ].compact.join(" ") > >> end > >> end > >> > >> > >> _______________________________________________ > >> Rails mailing list > >> Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org > >> http://lists.rubyonrails.org/mailman/listinfo/rails > >> > > > > > > -- > > http://www.codyfauser.com > > _______________________________________________ > > Rails mailing list > > Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org > > http://lists.rubyonrails.org/mailman/listinfo/rails > > > > > > ______________ > ALIEN8 RECORDINGS > P.O. BOX 666, STATION R > MONTREAL, QC > CANADA, H2S 3L1 > > http://www.alien8recordings.com > > _______________________________________________ > Rails mailing list > Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org > http://lists.rubyonrails.org/mailman/listinfo/rails >-- http://www.codyfauser.com
Hey Cody, Thanks for yet more help on this issue (I''ve been working on other things in the last few days). I was able to get a custom auto_complete for function working, but now I am starting to wonder if creating an attribute by aggregation was really the way to go. When I submit the search form that I am using the auto_complete_for text field in I am calling a find() on the author model with a conditional statement and rendering an editing form with the resulting record. Since I have now learned that apparently all finds on columns other than id require sql (the conditional statements) I guess I''m in the same position that led me to try the custom auto_complete_for function. So I guess now my question is: do you know a way to do a conditional find on an active record object, so that I can match to the aggregated Name attribute? If not, I wonder if there is any way to get the auto_complete_for text field to pass an id even while the author name is being displayed. Thanks again, Sean On 6-Dec-05, at 6:15 PM, Cody Fauser wrote:> Sean, > > It all depends on what you''re doing. The reason auto_complete_for > doesn''t work on the aggregate is because it builds the sql where > conditions based on the symbol you pass in. Since there isn''t a > ''name'' column in your table the query will fail. Click the ''show > source'' link on the rdocs for auto_complete_for for more details: > http://api.rubyonrails.com/classes/ActionController/Macros/ > AutoComplete/ClassMethods.html#M000032 > > Depending on your circumstances you could still access the attributes > author.first_name author.last_name. Otherwise, in the case of > autocomplete you can check out Thomas Fuchs'' fantastic demos at > http://demo.script.aculo.us/, which show a customized autocomplete in > action. > > > > Cody > > > > On 12/6/05, Alien8 Recordings <alien8-Mu2R4EvrfYk2NbfV7ZGCIlaTQe2KTcn/@public.gmane.org> wrote: >> Hey Cody, >> >> Sorry, just one more question. I see that you can''t use symbols to >> access model attributes that are aggregated, but what does one do in >> the case when one wants to pass them to a method that requires >> symbols, such as: >> auto_complete_for :post, :title >> >> Thanks, >> Sean >> >> On 6-Dec-05, at 3:47 PM, Cody Fauser wrote: >> >>> Use: <td><%= author.name %></td> then check out page 203. >>> >>> >>> >>> Cody >>> >>> On 12/6/05, Alien8 Recordings <alien8-Mu2R4EvrfYk2NbfV7ZGCIlaTQe2KTcn/@public.gmane.org> wrote: >>>> First off, apologies about my previous empty post. >>>> >>>> Also, apologies for the newbie nature of this post. I am new to >>>> rails >>>> and I''m working on a simple relational database to be administered >>>> and accessible to the public through rails. I have a question about >>>> aggregation as outlined in the pragprog "agile web development" >>>> book, >>>> around page 258 to 260. My example is nearly identical to the one >>>> used in the book. I have basically followed the example there to >>>> the >>>> letter, the only difference is that I want to aggregate fields >>>> from a >>>> model called Author rather than Customer, and one of the field >>>> names >>>> is different. >>>> >>>> My question is simply this, once the Author model refers to the new >>>> Name model, how can I access the new :name attribute of >>>> instances of >>>> Author? I tried to do that in a view with the following code: >>>> <td><%>>>> author[:name] %></td> It doesn''t return an error, just doesn''t >>>> output >>>> anything. The book shows how to created a new instance of Customer >>>> with the aggregate Name object, but what about instances from a >>>> database record? Shouldn''t they have a :name attribute if they have >>>> all the attributes that it''s composed of? >>>> >>>> The code I''ve used for Author and Name models is below. Thanks in >>>> advance for any info on where I''m going wrong. >>>> >>>> *** app/models/author.rb *** >>>> class Author < ActiveRecord::Base >>>> >>>> has_and_belongs_to_many :books >>>> validates_presence_of :first_name, :last_name >>>> >>>> # composed_of declaration maps Author attributes to the Name >>>> model >>>> object >>>> composed_of :name, >>>> :class_name => Name, >>>> :mapping => >>>> [ [ :first_name, :first ], >>>> [ :other_name, :other], >>>> [ :last_name, :last] >>>> ] >>>> end >>>> *** >>>> >>>> *** app/models/name.rb *** >>>> # Class defines the Name object, aggregation of attirbutes of >>>> Author >>>> # object. >>>> class Name >>>> attr_reader :first, :other, :last >>>> >>>> def initialize(first, other, last) >>>> @first = first >>>> @other = other >>>> @last = last >>>> end >>>> >>>> def to_s >>>> [ @first, @other, @last ].compact.join(" ") >>>> end >>>> end >>>> >>>> >>>> _______________________________________________ >>>> Rails mailing list >>>> Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org >>>> http://lists.rubyonrails.org/mailman/listinfo/rails >>>> >>> >>> >>> -- >>> http://www.codyfauser.com >>> _______________________________________________ >>> Rails mailing list >>> Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org >>> http://lists.rubyonrails.org/mailman/listinfo/rails >>> >>> >> >> ______________ >> ALIEN8 RECORDINGS >> P.O. BOX 666, STATION R >> MONTREAL, QC >> CANADA, H2S 3L1 >> >> http://www.alien8recordings.com >> >> _______________________________________________ >> Rails mailing list >> Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org >> http://lists.rubyonrails.org/mailman/listinfo/rails >> > > > -- > http://www.codyfauser.com > >______________ ALIEN8 RECORDINGS P.O. BOX 666, STATION R MONTREAL, QC CANADA, H2S 3L1 http://www.alien8recordings.com
Sean, For autocompleting names I usually cheat and create a full_name attribute for the object. Then I create a before_save callback that creates the full name from the first and last name. I am sacrificing the extra storage space for convenience. I find it is usually easier to bend your ideals to match Rails than the other way around. class Person < ActiveRecord::Base validates_presence_of :first_name, :last_name before_save :generate_full_name composed_of :name, :mapping => [ [ :first_name, :first], [ :last_name, :last ] ] def self.find_by_name(name) self.find_all_by_first_name_and_last_name(name.first, name.last) end private def generate_full_name self.full_name = self.first_name + " " + self.last_name end end class Name attr_reader :first, :last def initialize(first, last) @first, @last = first, last end def last_first "#@last, #@first" end end This way you can keep all of your methods that are specific to names, like last_first, in the Name class and use them for display purposes, but you can still conveniently autocomplete forms. There is some duplication, but I don''t think it really matters in the long run. There are also dynamically generated finders for your attributes. These methods are automatically available for the model I''ve created above (and more): Person.find_by_first_name_and_last_name(''Cody'', ''Fauser'') Person.find_all_by_full_name(''Cody Fauser'') And using the method defined above: Person.find_by_name(Name.new(''Cody'', ''Fauser'')) Hope this helps. Cody On 12/9/05, Alien8 Recordings <alien8-Mu2R4EvrfYk2NbfV7ZGCIlaTQe2KTcn/@public.gmane.org> wrote:> Hey Cody, > > Thanks for yet more help on this issue (I''ve been working on other > things in the last few days). > > I was able to get a custom auto_complete for function working, but > now I am starting to wonder if creating an attribute by aggregation > was really the way to go. When I submit the search form that I am > using the auto_complete_for text field in I am calling a find() on > the author model with a conditional statement and rendering an > editing form with the resulting record. Since I have now learned that > apparently all finds on columns other than id require sql (the > conditional statements) I guess I''m in the same position that led me > to try the custom auto_complete_for function. So I guess now my > question is: do you know a way to do a conditional find on an active > record object, so that I can match to the aggregated Name attribute? > If not, I wonder if there is any way to get the auto_complete_for > text field to pass an id even while the author name is being displayed. > > Thanks again, > Sean > > > On 6-Dec-05, at 6:15 PM, Cody Fauser wrote: > > > Sean, > > > > It all depends on what you''re doing. The reason auto_complete_for > > doesn''t work on the aggregate is because it builds the sql where > > conditions based on the symbol you pass in. Since there isn''t a > > ''name'' column in your table the query will fail. Click the ''show > > source'' link on the rdocs for auto_complete_for for more details: > > http://api.rubyonrails.com/classes/ActionController/Macros/ > > AutoComplete/ClassMethods.html#M000032 > > > > Depending on your circumstances you could still access the attributes > > author.first_name author.last_name. Otherwise, in the case of > > autocomplete you can check out Thomas Fuchs'' fantastic demos at > > http://demo.script.aculo.us/, which show a customized autocomplete in > > action. > > > > > > > > Cody > > > > > > > > On 12/6/05, Alien8 Recordings <alien8-Mu2R4EvrfYk2NbfV7ZGCIlaTQe2KTcn/@public.gmane.org> wrote: > >> Hey Cody, > >> > >> Sorry, just one more question. I see that you can''t use symbols to > >> access model attributes that are aggregated, but what does one do in > >> the case when one wants to pass them to a method that requires > >> symbols, such as: > >> auto_complete_for :post, :title > >> > >> Thanks, > >> Sean > >> > >> On 6-Dec-05, at 3:47 PM, Cody Fauser wrote: > >> > >>> Use: <td><%= author.name %></td> then check out page 203. > >>> > >>> > >>> > >>> Cody > >>> > >>> On 12/6/05, Alien8 Recordings <alien8-Mu2R4EvrfYk2NbfV7ZGCIlaTQe2KTcn/@public.gmane.org> wrote: > >>>> First off, apologies about my previous empty post. > >>>> > >>>> Also, apologies for the newbie nature of this post. I am new to > >>>> rails > >>>> and I''m working on a simple relational database to be administered > >>>> and accessible to the public through rails. I have a question about > >>>> aggregation as outlined in the pragprog "agile web development" > >>>> book, > >>>> around page 258 to 260. My example is nearly identical to the one > >>>> used in the book. I have basically followed the example there to > >>>> the > >>>> letter, the only difference is that I want to aggregate fields > >>>> from a > >>>> model called Author rather than Customer, and one of the field > >>>> names > >>>> is different. > >>>> > >>>> My question is simply this, once the Author model refers to the new > >>>> Name model, how can I access the new :name attribute of > >>>> instances of > >>>> Author? I tried to do that in a view with the following code: > >>>> <td><%> >>>> author[:name] %></td> It doesn''t return an error, just doesn''t > >>>> output > >>>> anything. The book shows how to created a new instance of Customer > >>>> with the aggregate Name object, but what about instances from a > >>>> database record? Shouldn''t they have a :name attribute if they have > >>>> all the attributes that it''s composed of? > >>>> > >>>> The code I''ve used for Author and Name models is below. Thanks in > >>>> advance for any info on where I''m going wrong. > >>>> > >>>> *** app/models/author.rb *** > >>>> class Author < ActiveRecord::Base > >>>> > >>>> has_and_belongs_to_many :books > >>>> validates_presence_of :first_name, :last_name > >>>> > >>>> # composed_of declaration maps Author attributes to the Name > >>>> model > >>>> object > >>>> composed_of :name, > >>>> :class_name => Name, > >>>> :mapping => > >>>> [ [ :first_name, :first ], > >>>> [ :other_name, :other], > >>>> [ :last_name, :last] > >>>> ] > >>>> end > >>>> *** > >>>> > >>>> *** app/models/name.rb *** > >>>> # Class defines the Name object, aggregation of attirbutes of > >>>> Author > >>>> # object. > >>>> class Name > >>>> attr_reader :first, :other, :last > >>>> > >>>> def initialize(first, other, last) > >>>> @first = first > >>>> @other = other > >>>> @last = last > >>>> end > >>>> > >>>> def to_s > >>>> [ @first, @other, @last ].compact.join(" ") > >>>> end > >>>> end > >>>> > >>>> > >>>> _______________________________________________ > >>>> Rails mailing list > >>>> Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org > >>>> http://lists.rubyonrails.org/mailman/listinfo/rails > >>>> > >>> > >>> > >>> -- > >>> http://www.codyfauser.com > >>> _______________________________________________ > >>> Rails mailing list > >>> Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org > >>> http://lists.rubyonrails.org/mailman/listinfo/rails > >>> > >>> > >> > >> ______________ > >> ALIEN8 RECORDINGS > >> P.O. BOX 666, STATION R > >> MONTREAL, QC > >> CANADA, H2S 3L1 > >> > >> http://www.alien8recordings.com > >> > >> _______________________________________________ > >> Rails mailing list > >> Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org > >> http://lists.rubyonrails.org/mailman/listinfo/rails > >> > > > > > > -- > > http://www.codyfauser.com > > > > > > ______________ > ALIEN8 RECORDINGS > P.O. BOX 666, STATION R > MONTREAL, QC > CANADA, H2S 3L1 > > http://www.alien8recordings.com > >-- http://www.codyfauser.com