Question

I've just seen this line of Ruby code in ruby-trello:

# Returns the member who created the action.
one :member_creator, :via => Member, :using => :member_creator_id

It seems to relate to a superclass method defined as:

def self.one(name, opts = {})
  class_eval do
    define_method(:"#{name}") do |*args|
      options = opts.dup
      klass   = options.delete(:via) || Trello.const_get(name.to_s.camelize)
      ident   = options.delete(:using) || :id
      klass.find(self.send(ident))
    end
  end
end

I understand that class_eval relates to reflection.

Could someone please explain the purpose of the subclass code line?

My guess would be that it's calling the class member one passing :member_creator as name and the two trailing args as the opts argument. But why would this be called at the class level?

Was it helpful?

Solution

It is appears to be a way to DRY up some code used to find a single record by primary key.

You basically pass a class/model name and a method used to get the primary key.

This code:

one :member_creator, :via => Member, :using => :member_creator_id

Creates this method:

def member_creator 
  Member.find(self.member_creator_id)
end
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top