Scriverò sicuramente convalide per questo: è più semplice fornire buoni messaggi di errore a un utente da una convalida. Vorrei anche eseguire il backup con un vincolo di database. Sembra che i limiti di controllo possano effettivamente fare il lavoro.
Rails non ha supporto per questo che potrei trovare quindi è necessario creare la tabella con sql raw. Dovrai inoltre modificare lo schema di dump dello schema su :sql
poiché le rotaie non saranno in grado di produrre uno schema.rb
che lo descriva effettivamente.
Ho scritto questa migrazione
class CreateFoos < ActiveRecord::Migration
def change
execute <<SQL
CREATE TABLE foos (
id INTEGER PRIMARY KEY,
x_id INTEGER,
y_id INTEGER,
constraint xorit check((x_id OR y_id) AND NOT(x_id AND y_id))
)
SQL
end
end
Poi nella console rotaie
Foo.create(:x_id => 1, :y_id => 1) #=> SQLite3::ConstraintException
Come è possibile creare una riga con né insieme né x_id y_id. Si potrebbe cambiare questo cambiando il vincolo,
(x_id IS NOT NULL OR y_id IS NOT NULL) AND (x_id IS NULL OR y_id IS NULL)
sembrava funzionare per me
fonte
2011-12-30 22:22:05
Grazie per la risposta! In combinazione con la risposta di @ Frederick, otterrò una soluzione completa alle mie domande. – Robin
Sarei d'accordo di più con la risposta di @ mynameiscoffey. Avere solo una colonna per la chiave esterna nella tabella 'A', quindi abbiamo' imageable_id' e 'imageable_type' nella tabella A –