Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
ranked-model / spec / support / active_record.rb
Size: Mime:
require 'active_record'
require 'logger'

ROOT = File.join(File.dirname(__FILE__), '..')

DB_CONFIG = "test" + (ENV['DB'] ? "_#{ENV['DB'].downcase}" : '')

ActiveRecord::Base.logger = Logger.new('tmp/ar_debug.log')
ActiveRecord::Base.configurations = YAML::load(IO.read('spec/support/database.yml'))
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations[DB_CONFIG])

ActiveRecord::Schema.define :version => 0 do
  create_table :ducks, :force => true do |t|
    t.string :name
    t.integer :row
    t.integer :size
    t.integer :age
    t.integer :lake_id
    t.integer :flock_id
    t.integer :landing_order
    t.string :pond
  end

  create_table :wrong_scope_ducks, :force => true do |t|
    t.string :name
    t.integer :size
    t.string :pond
  end

  create_table :wrong_field_ducks, :force => true do |t|
    t.string :name
    t.integer :age
    t.string :pond
  end

  create_table :elements, :force => true do |t|
    t.string :symbol
    t.string :type
    t.integer :combination_order
  end

  create_table :vehicles, :force => true do |t|
    t.string :color
    t.string :manufacturer
    t.string :type
    t.integer :parking_order
  end

  create_table :egos, :primary_key => :alternative_to_id, :force => true do |t|
    t.string :name
    t.integer :size
  end

  create_table :players, :force => true do |t|
    t.string :name
    t.string :city
    t.integer :score
  end
end

class Duck < ActiveRecord::Base

  include RankedModel
  @@rearrange_receiver = nil
  @@rebalance_receiver = nil
  ranks :row, :on_rank_rearrange => lambda { |rearranged_ids|
      @@rearrange_receiver.rearranged(rearranged_ids) if @@rearrange_receiver
    }, :on_rank_rebalance => lambda { |rebalanced_ids|
      @@rebalance_receiver.rearranged(rebalanced_ids) if @@rebalance_receiver
    }
  ranks :size, :scope => :in_shin_pond
  ranks :age, :with_same => :pond

  ranks :landing_order, :with_same => [:lake_id, :flock_id]

  scope :in_lake_and_flock, lambda {|lake, flock| where(:lake_id => lake, :flock_id => flock) }

  scope :in_shin_pond, lambda { where(:pond => 'Shin') }

  def self.rearrange_receiver=(value)
    @@rearrange_receiver = value
  end

  def self.rebalance_receiver=(value)
    @@rebalance_receiver = value
  end
end

# Negative examples

class WrongScopeDuck < ActiveRecord::Base

  include RankedModel
  ranks :size, :scope => :non_existant_scope

end

class WrongFieldDuck < ActiveRecord::Base

  include RankedModel
  ranks :age, :with_same => :non_existant_field
end

class ReallyWrongFieldDuck < ActiveRecord::Base
  self.table_name = :wrong_field_ducks
  include RankedModel
  ranks :age, :with_same => [:name, :non_existant_field]
end

# Example for STI, ranking within each child class

class Element < ActiveRecord::Base

  include RankedModel
  ranks :combination_order

end

class TransitionMetal < Element

end

class NobleGas < Element

end

# Example for STI, ranking within parent

class Vehicle < ActiveRecord::Base

  include RankedModel
  ranks :parking_order, :class_name => 'Vehicle'

end

class Car < Vehicle

end

class Truck < Vehicle

end

# Example for STI, overriding parent's ranking

class MotorBike < Vehicle

  include RankedModel
  ranks :parking_order, :class_name => 'Vehicle', :with_same => :color

end

class Ego < ActiveRecord::Base
  primary_key = :alternative_to_id
  include RankedModel
  ranks :size
end

class Player < ActiveRecord::Base
  # don't add rank yet, do it in the specs
end