Prendiamo due semplici modelli di Rails, Post e PostRevision.
class Post < ApplicationRecord
# Attribute: Status (ex: draft, public, private, deleted)
# Attribute: Views
# An owner, likely a belongs_to relation. Perhaps a has_many relation.
has_many :post_revisions
validates :post_revisions, :presence => true
has_many :comments
has_many :votes
# Delegation to most recent active / not deleted PostRevision for title,
# body, tags to effectively expose these attributes
end
class PostRevision < ApplicationRecord
belongs_to :post
# Attribute: Title
# Attribute: Body
# Attribute: Status (ex: deleted / not deleted, perhaps just an int flag)
# Attribute: Views
# Attribute: Revision history notes / text.
# If a Post has_many owners, an attribute for author/owner of revision
has_many :tags
end
Il comportamento predefinito dell'associazione "appartiene a" è di richiedere che il record associato sia presente (ovvero, un PostRevision deve avere un Post - questo può essere disabilitato con un argomento).
Questo modello è concettualmente vero, tuttavia c'è un problema che si manifesta nelle azioni di configurazione e controllo del test - vedi questa domanda di overflow dello stack su " "1 a 1 o più" relazioni in SQL . Non è possibile creare un PostRevision finché non c'è un post, ma è necessario un postRevision valido per creare un post. Vedo due opzioni: posso rendere opzionale la relazione "appartiene a" in PostRevision. Questo mi consentirà di creare PostRevision prima di un post e di associarli. In alternativa, posso rimuovere la convalida dell'esistenza di PostRevision su un post. Questo mi permetterebbe di creare un Post e poi PostRevision multipli.
Mi sto appoggiando al secondo approccio: rimuovi la convalida su Post. Tuttavia, non riesco a mettere in parole perché questa è l'opzione migliore, a parte il fatto che sembra più giusto creare il post e le cose che tagliano le revisioni e quindi la revisione con il resto del testo i dati.
Esiste un approccio alternativo che non ho considerato? In caso contrario, c'è qualche tipo di giustificazione razionale all'approccio a cui mi sto proponendo?