Join Table Validation Question

Hi All,

Here’s my situation. People have Availability for Events. I need to
ensure that each Person is Available for each Event exactly once.

I’m thinking the way to do it would be with a before_save method in
Availability that does an

Availability.find(“event_id = ? and person_id = ?”, record.event_id,
record.person_id)

and complains if it finds one.

Is this the way to go or is there a better approach?

**Leigh

=============

#Person.rb
class Person < ActiveRecord::Base
has_many :availabilities
has_many :events, :through => :availabilities
default_scope :order => ‘name ASC’
validates_presence_of :name, :on => :create, :message => “-- You need
to enter your name”
end

#Availability.rb
class Availability < ActiveRecord::Base
belongs_to :event
belongs_to :person
validates_presence_of :person_id, :on => :create, :message => “can’t
be blank”
validates_presence_of :event_id, :on => :create, :message => “can’t be
blank”
end

#Event.rb
class Event < ActiveRecord::Base
has_many :availabilities
has_many :people, :through => :availabilities

default_scope :order => ‘date ASC’
validates_presence_of :name, :on => :create, :message => “can’t be
blank”
validates_presence_of :date, :on => :create, :message => “can’t be
blank”
end

Schema.rb

ActiveRecord::Schema.define(:version => 20110809224443) do
create_table “availabilities”, :force => true do |t|
t.integer “event_id”
t.integer “person_id”
. . .
end

create_table “events”, :force => true do |t|
t.string “name”
t.datetime “date”
. . .
end

create_table “people”, :force => true do |t|
t.string “name”
. . .
end
end

On Aug 10, 8:42pm, Leigh D. [email protected] wrote:

Is this the way to go or is there a better approach?
I’d stick a unique index on that pair of columns too - it’s the only
way to get a cast iron guarantee for this sort of thing.

Fred

On Aug 10, 9:23pm, Leigh D. [email protected] wrote:

record.person_id)
add_index “availabilities”, [“person_id”, “event_id”],
:name => “person_id_event_id”, :unique => true

That’s the one.

Fred

Availability.find(“event_id = ? and person_id = ?”, record.event_id,
record.person_id)

and complains if it finds one.

Is this the way to go or is there a better approach?

I’d stick a unique index on that pair of columns too - it’s the only
way to get a cast iron guarantee for this sort of thing.

Is this what you meant, Fred?

  add_index "availabilities", ["person_id", "event_id"],
    :name => "person_id_event_id", :unique => true

**Leigh