It seems like there may be a rails method for the following situation: model User has_many :appointments model Appointment has_one :instruction belongs_to :user model Instruction belongs_to :appointment I would like to do User.Appointments.Instruction and return an array with instruction objects but no go. I am doing the following and wondering if there is a cleaner way? appointments = logged_in_user.appointments @instructions = Array.new appointments.each do |appointment| @instructions.push(appointment.instruction) end Thanks for any help/input.
2009/6/3 David <dlynam-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>:> > It seems like there may be a rails method for the following situation: > model User > has_many :appointments > > model Appointment > has_one :instruction > belongs_to :user > > model Instruction > belongs_to :appointment > > I would like to do User.Appointments.Instruction and return an array > with instruction objects but no go. I am doing the following and > wondering if there is a cleaner way? > > appointments = logged_in_user.appointments > @instructions = Array.new > appointments.each do |appointment| > -TD4eR/CYN4piYlGga5LLOu1GAupnlqi7@public.gmane.org(appointment.instruction) > endSomething like @instructions = logged_in_user.appointments.collect { |a| [a.instruction] } Though I think I would consider something like putting this in a method of User that returned an array of instructions for that user. Or a class method or User that does it for the current logged in user. Dependent on the rest of your requirements of course. You might want to consider a class member of Appointments that takes an array of appointments and returns an array of instructions. Colin Colin> > Thanks for any help/input. > > >
Okay, thanks a lot. That really helps. For the logged_in_user, that would be a User instance method, right? Something like: Class User < ActiveRecord::Base def return_instructions_array instructions = Instructions.return_array(self.appointments) end end This would be an Instructions class method...is this better than an Instruction instance method? like: Instructions.new.return_array(self.appointments) I''m never really sure which is better. On Jun 3, 12:21 am, Colin Law <clan...-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> wrote:> 2009/6/3 David <dly...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>: > > > > > > > It seems like there may be a rails method for the following situation: > > model User > > has_many :appointments > > > model Appointment > > has_one :instruction > > belongs_to :user > > > model Instruction > > belongs_to :appointment > > > I would like to do User.Appointments.Instruction and return an array > > with instruction objects but no go. I am doing the following and > > wondering if there is a cleaner way? > > > appointments = logged_in_user.appointments > > @instructions = Array.new > > appointments.each do |appointment| > > -TD4eR/CYN4piYlGga5LLOu1GAupnlqi7@public.gmane.org(appointment.instruction) > > end > > Something like > @instructions = logged_in_user.appointments.collect { |a| [a.instruction] } > > Though I think I would consider something like putting this in a > method of User that returned an array of instructions for that user. > Or a class method or User that does it for the current logged in user. > Dependent on the rest of your requirements of course. You might want > to consider a class member of Appointments that takes an array of > appointments and returns an array of instructions. > > Colin > > Colin > > > > > Thanks for any help/input.
2009/6/3 Dave L <dlynam-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>:> > Okay, thanks a lot. That really helps. For the logged_in_user, that > would be a User instance method, right? Something like: > > Class User < ActiveRecord::Base > def return_instructions_array > instructions = Instructions.return_array(self.appointments) > end > endIt is a matter of taste, but I would probably just call it instructions, and you don''t actually need the assignment operation, a method automatically returns the last value determined so I would possibly use def instructions Instructions.appointments(self.appointments) end Then the call reads intuitively @instructions = User.instructions Or maybe better if it were called current_instructions to indicate that it is the current user. I always try and make the code read so that it as clear as possible what is happening without having to use any more comments than necessary.> This would be an Instructions class method...is this better than an > Instruction instance method? like: > > Instructions.new.return_array(self.appointments)There is no point making it an instance method, it just means you have to make an instance in order to call it. Generally if a method is acting on a single instance of a class then it should be an instance method, if it is acting on a set of them then make it a class method. Not that I am a Ruby expert, there may well be a more elegant way of achieving this. Colin> > I''m never really sure which is better. > >
David wrote:> It seems like there may be a rails method for the following situation: > model User > has_many :appointments > > model Appointment > has_one :instruction > belongs_to :user > > model Instruction > belongs_to :appointment > > I would like to do User.Appointments.Instruction and return an array > with instruction objectsTry User :has_many instructions, :through => appointments. I think that will define User#instructions, which should do exactly what you want. Best, -- Marnen Laibow-Koser http://www.marnen.org marnen-sbuyVjPbboAdnm+yROfE0A@public.gmane.org -- Posted via http://www.ruby-forum.com/.
2009/6/3 Marnen Laibow-Koser <rails-mailing-list-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org>:> > David wrote: >> It seems like there may be a rails method for the following situation: >> model User >> has_many :appointments >> >> model Appointment >> has_one :instruction >> belongs_to :user >> >> model Instruction >> belongs_to :appointment >> >> I would like to do User.Appointments.Instruction and return an array >> with instruction objects > > Try User :has_many instructions, :through => appointments. I think that > will define User#instructions, which should do exactly what you want. >That''s much better, I should have thought of that. I have learnt more here attempting to answer questions than I have through the questions I have asked myself. Colin> Best, > -- > Marnen Laibow-Koser > http://www.marnen.org > marnen-sbuyVjPbboAdnm+yROfE0A@public.gmane.org > -- > Posted via http://www.ruby-forum.com/. > > > >