pirate.rb 3.2 KB
Newer Older
1
class Pirate < ActiveRecord::Base
2 3 4 5
  belongs_to :parrot, :validate => true
  belongs_to :non_validated_parrot, :class_name => 'Parrot'
  has_and_belongs_to_many :parrots, :validate => true
  has_and_belongs_to_many :non_validated_parrots, :class_name => 'Parrot'
6 7 8 9 10 11 12 13 14 15
  has_and_belongs_to_many :parrots_with_method_callbacks, :class_name => "Parrot",
    :before_add    => :log_before_add,
    :after_add     => :log_after_add,
    :before_remove => :log_before_remove,
    :after_remove  => :log_after_remove
  has_and_belongs_to_many :parrots_with_proc_callbacks, :class_name => "Parrot",
    :before_add    => proc {|p,pa| p.ship_log << "before_adding_proc_parrot_#{pa.id || '<new>'}"},
    :after_add     => proc {|p,pa| p.ship_log << "after_adding_proc_parrot_#{pa.id || '<new>'}"},
    :before_remove => proc {|p,pa| p.ship_log << "before_removing_proc_parrot_#{pa.id}"},
    :after_remove  => proc {|p,pa| p.ship_log << "after_removing_proc_parrot_#{pa.id}"}
16

17
  has_many :treasures, :as => :looter
18
  has_many :treasure_estimates, :through => :treasures, :source => :price_estimates
19

20
  # These both have :autosave enabled because accepts_nested_attributes_for is used on them.
21
  has_one :ship
22
  has_one :update_only_ship, :class_name => 'Ship'
23
  has_one :non_validated_ship, :class_name => 'Ship'
24
  has_many :birds
25 26 27 28 29 30 31 32 33 34
  has_many :birds_with_method_callbacks, :class_name => "Bird",
    :before_add    => :log_before_add,
    :after_add     => :log_after_add,
    :before_remove => :log_before_remove,
    :after_remove  => :log_after_remove
  has_many :birds_with_proc_callbacks, :class_name => "Bird",
    :before_add     => proc {|p,b| p.ship_log << "before_adding_proc_bird_#{b.id || '<new>'}"},
    :after_add      => proc {|p,b| p.ship_log << "after_adding_proc_bird_#{b.id || '<new>'}"},
    :before_remove  => proc {|p,b| p.ship_log << "before_removing_proc_bird_#{b.id}"},
    :after_remove   => proc {|p,b| p.ship_log << "after_removing_proc_bird_#{b.id}"}
35
  has_many :birds_with_reject_all_blank, :class_name => "Bird"
36 37

  accepts_nested_attributes_for :parrots, :birds, :allow_destroy => true, :reject_if => proc { |attributes| attributes.empty? }
38
  accepts_nested_attributes_for :ship, :allow_destroy => true, :reject_if => proc { |attributes| attributes.empty? }
39
  accepts_nested_attributes_for :update_only_ship, :update_only => true
40 41
  accepts_nested_attributes_for :parrots_with_method_callbacks, :parrots_with_proc_callbacks,
    :birds_with_method_callbacks, :birds_with_proc_callbacks, :allow_destroy => true
42
  accepts_nested_attributes_for :birds_with_reject_all_blank, :reject_if => :all_blank
43

44
  validates_presence_of :catchphrase
45 46 47 48 49

  def ship_log
    @ship_log ||= []
  end

50 51 52 53
  def reject_empty_ships_on_create(attributes)
    attributes.delete('_reject_me_if_new').present? && new_record?
  end

54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
  private
    def log_before_add(record)
      log(record, "before_adding_method")
    end

    def log_after_add(record)
      log(record, "after_adding_method")
    end

    def log_before_remove(record)
      log(record, "before_removing_method")
    end

    def log_after_remove(record)
      log(record, "after_removing_method")
    end

    def log(record, callback)
      ship_log << "#{callback}_#{record.class.name.downcase}_#{record.id || '<new>'}"
    end
74
end