Rotaie 4:
Supponiamo di avere due modelli Film e Attore. L'attore ha molti film e il film appartiene all'attore. Nella maggior parte dei casi, gli sviluppatori utilizzati per convalidare la chiave esterna actor_id è presente o meno. In questo caso, non convaliderà il modello dell'attore per stabilire se l'ID dell'attore inserito esiste o meno. È proprio come la convalida degli attributi che verifica sempre che i campi non siano vuoti quando si invia il modulo.
Convalida con chiave esterna:
class Movie < ApplicationRecord appartiene_a :actor convalida :actor_id, presenza: true end
class Actor < ApplicationRecord has_many :movies,dependent: :destroy end
Lo scenario precedente convalida la presenza dell'ID attore o non come il normale validatore della presenza di attributi.
Esempio: Actor.create(titolo: "abc"). => {id: 1, titolo: 'abc'} m = Movie.new(titolo: “ok ok”, actor_id: 111) => m.valid? => true => Actor.find(111) ActiveRecord::RecordNotFound: impossibile trovare l'attore con 'id'=111
Possiamo ancora salvare la registrazione del film senza un attore valido.
Con le associazioni
class Movie < ApplicationRecord appartiene_a :actor convalida :actor, presenza: true end
(O)
class Movie < ApplicationRecord appartiene_a :actor, richiesto: true end
class Actor < ApplicationRecord has_many :movies,dependent: :destroy end
Esempio: Actor.create(titolo: "abc"). ==> {id: 1, titolo: 'abc'} m = Film.nuovo(titolo: “ok ok”, actor_id: 111) ==> m.valido? => false ==> m.errors.full_messages, ['L'attore non può essere vuoto']
In questo caso verrà sempre convalidato se l'attore inserito esiste o meno. In caso di un attore non valido ti viene generato un errore. Questa è la migliore pratica per creare le tue associazioni. Controlla sempre che l'oggetto associato esista o meno.
Rotaie5
Da rails5 queste convalide sono state aggiunte per impostazione predefinita. Convalida che l'oggetto dell'associazione deve essere presente quando si definiscono le associazioni di appartenenza.
Note di rilascio
http://guides.rubyonrails.org/5_0_release_notes.html(belongs_to ora attiverà un errore di convalida per impostazione predefinita se l'associazione non è presente.)
Possiamo disattivare completamente questa funzionalità dall'applicazione impostando l'opzione di configurazione nel file inizializzatore.
config/initializers/new_framework_defaults.rb
Rails.application.config.active_record.belongs_to_required_by_default = false
Questo file inizializzatore è presente solo nell'applicazione rails5. È necessario aggiungere manualmente questo file di inizializzazione quando si esegue la migrazione da una versione precedente dell'applicazione Rails e si apportano le modifiche necessarie.
class Post < ApplicationRecord has_many :commenti, dipendente: :distruggi fine
class Commento < ApplicationRecord appartiene_a :post end
c = Comment.create(titolo: “post fantastico”) c.errors.full_messages.to_sentence => “Il post deve esistere”
Non possiamo creare alcun record di commento senza un record associato.
Possiamo disattivare questo comportamento predefinito impostando
appartiene_a :post, opzionale: true
c = Comment.create(titolo: “post fantastico”)
=>
RailsCarma ha offerto Servizi di sviluppo di Ruby on Rails negli ultimi 8 anni. I nostri sviluppatori sono esperti nell'esecuzione di tutti i tipi di Sviluppo web di Ruby on Rails progetti e migliorando le funzionalità delle applicazioni Rails esistenti. Contattaci per saperne di più sulle nostre capacità di sviluppo e sui progetti su cui abbiamo lavorato.