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/. > > > >