[ruby-it] le foreign keys.

Mauro mrsanna1 a gmail.com
Mer 17 Dic 2008 14:42:05 CET


2008/12/16 Paolo Montrasio <paolo a paolomontrasio.com>

> A quanto ho capito, ma potrei sbagliarmi, il metodo references crea
> nella tabella i campi con i nomi giusti per poi essere usati
> dall'accoppiata belongs_to e has_one/many, perņ non crea la foreign key
> nello schema del db.
>
> Mauro wrote:
> > 2008/12/16 Salvatore <safeforge a gmail.com>
> >
> >> Io ho risolto con un plugin molto carino (foreign_key_migrations) per�
> > sono nuovo di questo mondo
> >> magari c'� un metodo migliore, la parola agli esperti :)
> >
> >
> > allora esperti fatevi sentire dai.....
>
> Non conoscevo quel plugin ma da quel che ho visto nella sua
> documentazione pare risolvere il problema molto bene. Finora, proprio
> con PostgreSQL, includevo questo modulo nelle migration perņ adesso
> forse cambierņ abitudini.
>
> -------------
> module MigrationHelpers
>  def foreign_key(from_table, from_column, to_table)
>    constraint_name = "fk_#{from_table}_#{from_column}"
>
>    execute %{alter table #{from_table}
>              add constraint #{constraint_name}
>              foreign key (#{from_column})
>              references #{to_table}(id)}
>  end
>
>  def remove_foreign_key(from_table, from_column)
>    constraint_name = "fk_#{from_table}_#{from_column}"
>
>    execute %{alter table #{from_table}
>              drop constraint #{constraint_name}}
>  end
> end


Solo per creare delle foreign key non c'e' necessita' di installarsi un
plugin, questo modulo basta e avanza, posso copiarmelo pari pari? :-)
Hai preso lo spunto dal manuale agile development?
Ho visto il codice in quel manuale, aggiunge anche dei trigger.
Forse pero' manca del codice, ne riporto uno stralcio:

module MigrationHelpers

  def foreign_key(from_table, from_column, to_table)
    constraint_name = "#{from_table}_#{to_table}_fkey"
    execute %{
      CREATE TRIGGER #{constraint_name}_insert
      BEFORE INSERT ON #{from_table}
      FOR EACH ROW BEGIN
        SELECT
          RAISE(ABORT, "constraint violation: #{constraint_name}" )
        WHERE
          (SELECT id FROM #{to_table} WHERE id = NEW.#{from_column}) IS
NULL;
      END;
    }

ci sono altri due trigger, uno per l'update e uno per il delete, non vedo
pero' dove crea le references.


More information about the Ml mailing list