Ho i seguenti 2 modelliRails after_initialize solo sui "nuovi"
class Sport < ActiveRecord::Base
has_many :charts, order: "sortWeight ASC"
has_one :product, :as => :productable
accepts_nested_attributes_for :product, :allow_destroy => true
end
class Product < ActiveRecord::Base
belongs_to :category
belongs_to :productable, :polymorphic => true
end
Uno sport non può esistere senza il prodotto, così nel mio sports_controller.rb
ho avuto:
def new
@sport = Sport.new
@sport.product = Product.new
...
end
ho cercato di spostare la creazione del prodotto per il modello sportivo, utilizzando after_initialize
:
after_initialize :create_product
def create_product
self.product = Product.new
end
ho imparato in fretta t il cappello after_initialize
viene chiamato ogni volta che viene creato un modello (ad esempio, da una chiamata find
). Quindi non era questo il comportamento che stavo cercando.
Qual è il modo in cui dovrei modellare il requisito che tutti gli sport
hanno uno product
?
Grazie
Il problema che ho usato con questa soluzione è che nel mio caso il campo prodotto può essere nullo (quindi ho davvero bisogno di after_initialize solo su create) .. se qualcuno ha un'idea, sarebbe fantastico, grazie! – yorch
@yorch Controlla prima/dopo_creare. Se la tua logica è troppo complicata, probabilmente non vuoi nasconderla in un hook before/after perché potrebbe essere troppo * magico *. – bostonou
Questo metodo tuttavia non è ottimizzato, una volta che inizi a selezionare una grande quantità di sport/prodotti, vedrai che la tua query è molto poco ottimizzata perché per ogni relazione hai una dichiarazione selezionata per vedere se il prodotto esiste – YaBoyQuy