module Associatable

Public Instance Methods

assoc_options() click to toggle source
# File lib/bezelrecord_base/associatable.rb, line 64
def assoc_options
  @prior_options ||= {}
end
belongs_to(name, options = {}) click to toggle source
# File lib/bezelrecord_base/associatable.rb, line 38
def belongs_to(name, options = {})
  options = BelongsToOptions.new(name, options)
  @prior_options = assoc_options
  @prior_options[name] = options

  define_method(options.class_name.downcase.to_sym) do
    foreign_key = send(options.foreign_key)
    the_class = options.model_class
    the_class.where(options.primary_key => foreign_key).first
  end
end
has_many(name, options = {}) click to toggle source
# File lib/bezelrecord_base/associatable.rb, line 50
def has_many(name, options = {})
  options = HasManyOptions.new(name, self,  options)
  @prior_options = assoc_options
  if @prior_options[name.to_s.singularize.to_sym].nil?
    @prior_options[name.to_s.singularize.to_sym] = options
  else
    @prior_options[name.to_s.singularize.to_sym] << options
  end
  define_method(options.table_name.to_sym) do
    primary_key = send(options.primary_key)
    options.model_class.where(options.foreign_key => primary_key)
  end
end
has_many_through(name, through_name, source_name) click to toggle source
# File lib/bezelrecord_base/associatable.rb, line 89
  def has_many_through(name, through_name, source_name)

    define_method(name) do
      through_options = self.class.assoc_options[through_name]
      source_options = through_options.model_class.assoc_options[source_name.to_s.singularize.to_sym]
      search_classes = through_options.model_class.where(through_options.foreign_key => send(source_options.primary_key))

      search_by = []
      search_classes.each do |classes|
        search_by << classes.send(source_options.primary_key)
      end

      results = DBConnection.execute(<<-SQL, *search_by)
        SELECT
        #{source_options.table_name}.*
        FROM
        #{through_options.table_name}
        JOIN
        #{source_options.table_name} ON #{source_options.table_name}.#{source_options.foreign_key.to_s} = #{through_options.table_name}.#{through_options.primary_key.to_s}
        WHERE
        #{through_options.table_name}.#{through_options.primary_key} IN (#{Array.new(search_by.length,"?").join(", ")})
        SQL
      results.map{|result| source_options.model_class.new(result)}
    end
  end
has_one_through(name, through_name, source_name) click to toggle source
# File lib/bezelrecord_base/associatable.rb, line 68
  def has_one_through(name, through_name, source_name)

    define_method(name) do
      through_options = self.class.assoc_options[through_name]
      source_options = through_options.model_class.assoc_options[source_name]
      search_by = send(through_options.foreign_key)

      results = DBConnection.execute(<<-SQL, search_by)
        SELECT
        #{source_options.table_name}.*
        FROM
        #{through_options.table_name}
        JOIN
        #{source_options.table_name} ON #{source_options.table_name}.#{source_options.primary_key.to_s} = #{through_options.table_name}.#{source_options.foreign_key.to_s}
        WHERE
        #{through_options.table_name}.#{through_options.primary_key} = ?
      SQL
      source_options.model_class.new(results.first)
    end
  end