Usando validate para algo un poco complejo

Veréis, tengo un sistema de ofertas en mi aplicación de tal modo que un
Club puede hacer una Offer a un Player de otro Club, el problema viene
en que necesito validar que un mismo Player no hace 2 veces la misma
oferta a un mismo jugador de un mismo equipo. Mi modelo oferta está tal
que así:

== Schema Information

Schema version: 20090608143112

Table name: offers

id :integer not null, primary key

club_id :integer not null

player_id :integer not null

buyer_id :integer not null

state :integer default(0)

created_at :datetime

updated_at :datetime

pay :decimal(16, 2) default(0.0)

class Offer < ActiveRecord::Base
PENDING = 0
ACCEPTED = 1
REJECTED = 2
TRANSFERED = 3
validates_uniqueness_of :buyer_id, :scope => :player_id #aquí veo el
problema
belongs_to :club
belongs_to :buyer, :class_name => ‘Club’
belongs_to :player
end

El problema está en que esa restricción sólo debería funcionar siempre y
cuando state = PENDING ¿Cómo puedo hacer esto con validate?

igual una opción es escribir tu propio validador:
http://chrisblunt.com/blog/2009/04/18/rails-writing-dry-custom-validators/

saludos

2009/6/10 Carlos Belizón [email protected]

Puedes condicionar la ejecución de la validación usando :if y :unless.

En tu caso, para que sólo se ejecute si el estado es PENDING vendría a
ser algo de este estilo:

validates_uniqueness_of :buyer_id, :scope => :player_id, :if
=> :pending?

def pending?
state == PENDING
end

De todas formas de esa forma no podrías crear una oferta pendiente si
ya existe alguna del mismo buyer al mismo player sea cual sea su estado.

Sin saber si te puede afectar por otro lado, para asegurar que solo
existe una oferta pendiente entre ellos creo que serviría esto:

validates_uniqueness_of :state, :scope => [:buyer_id, :player_id], :if
=> :pending?

Saludos

Andrés Cirugeda E.
ASPgems
Email: andres at aspgems dot com

‘All we have to decide is what to do with the time that is given to us’.
–Gandalf.

El 10/06/2009, a las 20:43, Carlos
Belizón escribió:

Veréis, tengo un sistema de ofertas en mi aplicación de tal modo que

Andrés Cirugeda E. wrote:

Puedes condicionar la ejecuci�n de la validaci�n usando :if y :unless.

Andr�s Cirugeda E.
ASPgems
Email: andres at aspgems dot com

‘All we have to decide is what to do with the time that is given to us’.
–Gandalf.

El 10/06/2009, a las 20:43, Carlos
Beliz�n escribi�:
Ver�is, tengo un sistema de ofertas en mi aplicaci�n de tal modo que

De esta forma funciona de perlas, incluso con transferencias circulares.

Aún así muchas gracias Borja Martín, he aprendido algo nuevo gracias a
su enlace.