Skip to content

Instantly share code, notes, and snippets.

@dhh
Created March 20, 2014 20:13
Show Gist options
  • Star 69 You must be signed in to star a gist
  • Fork 12 You must be signed in to fork a gist
  • Save dhh/9672827 to your computer and use it in GitHub Desktop.
Save dhh/9672827 to your computer and use it in GitHub Desktop.
class Ticket < ActiveRecord::Base
belongs_to :grouper
belongs_to :user
validate :user_cant_be_blacklisted, on: :confirmation
validate :user_cant_double_book, on: :confirmation
validate :grouper_cant_be_full, on: :confirmation
validate :grouper_cant_have_occurred, on: :confirmation
validate :ticket_cant_have_been_confirmed, on: :confirmation
def confirm
update confirmed: true if confirmable?
end
def confirmable?
valid? :confirmation
end
private
def user_cant_be_blacklisted
errors.add :user, "can't book a Grouper at this time" if user.blacklisted?
end
def user_cant_double_book
errors.add :user, 'are already going to a Grouper on that day' if user.has_existing_grouper?(grouper)
end
def grouper_cant_be_full
errors.add :grouper, 'has already occurred!' if grouper.full?
end
def grouper_cant_have_occurred
errors.add :grouper, 'has already occurred!' if grouper.past?
end
def ticket_cant_have_been_confirmed
errors.add :user, 'have already confirmed this ticket' if confirmed?
end
end
@ClayShentrup
Copy link

I wish there was an :except_on. I want to validate association presence except in tests, where I don't want to necessarily create a huge object graph just to test some isolated functionality. My strategy has been to use an attr_accessor to set :skip_association_presence_validations in tests. I wish I could use contexts.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment