Model Association Question

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.

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

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

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.

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

It 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

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