Können Sie mir sagen, was die beste Vorgehensweise zum Erstellen von has_one-Beziehungen ist?
zB wenn ich ein Benutzermodell habe und es ein Profil haben muss ...
Wie könnte ich das erreichen?
Eine Lösung wäre:
# user.rb
class User << ActiveRecord::Base
after_create :set_default_association
def set_default_association
self.create_profile
end
end
Aber das scheint nicht sehr sauber zu sein ... Irgendwelche Vorschläge?
ruby-on-rails
ruby
activerecord
ruby-on-rails-3
associations
BvuRVKyUVlViVIc7
quelle
quelle
user
, da dies derbefore_create
Fall ist ?Ihre Lösung ist definitiv ein anständiger Weg, dies zu tun (zumindest bis Sie herauswachsen), aber Sie können es vereinfachen:
# user.rb class User < ActiveRecord::Base has_one :profile after_create :create_profile end
quelle
Wenn dies eine neue Zuordnung in einer vorhandenen großen Datenbank ist, verwalte ich den Übergang wie folgt:
class User < ActiveRecord::Base has_one :profile before_create :build_associations def profile super || build_profile(avatar: "anon.jpg") end private def build_associations profile || true end end
Damit erhalten vorhandene Benutzerdatensätze ein Profil, wenn sie danach gefragt werden, und neue werden damit erstellt. Dies platziert auch die Standardattribute an einer Stelle und funktioniert ordnungsgemäß mit accept_nested_attributes_for ab Rails 4.
quelle
Wahrscheinlich nicht die sauberste Lösung, aber wir hatten bereits eine Datenbank mit einer halben Million Datensätzen, von denen einige bereits das 'Profil'-Modell erstellt hatten und einige nicht. Wir haben diesen Ansatz gewählt, der garantiert, dass zu jedem Zeitpunkt ein Profilmodell vorhanden ist, ohne dass alle Profilmodelle durchlaufen und rückwirkend generiert werden müssen.
alias_method :db_profile, :profile def profile self.profile = Profile.create(:user => self) if self.db_profile.nil? self.db_profile end
quelle
So mache ich es. Ich bin mir nicht sicher, wie Standard dies ist, aber es funktioniert sehr gut und ist faul, da es keinen zusätzlichen Overhead verursacht, es sei denn, es ist notwendig, die neue Zuordnung aufzubauen (ich bin froh, dass dies korrigiert wird):
def profile_with_auto_build build_profile unless profile_without_auto_build profile_without_auto_build end alias_method_chain :profile, :auto_build
Dies bedeutet auch, dass der Verein da ist, sobald Sie ihn brauchen. Ich denke, die Alternative besteht darin, sich in after_initialize einzuhängen, aber dies scheint einen erheblichen Overhead zu verursachen, da es jedes Mal ausgeführt wird, wenn ein Objekt initialisiert wird, und es kann Zeiten geben, in denen Sie nicht auf die Zuordnung zugreifen möchten. Es scheint eine Verschwendung zu sein, seine Existenz zu überprüfen.
quelle
has_one :profile, :autosave => true
Dafür gibt es ein Juwel:
https://github.com/jqr/has_one_autocreate
Sieht so aus, als wäre es jetzt ein bisschen alt. (nicht mit Rails3 arbeiten)
quelle
Ich hatte ein Problem damit und akzeptiere_nested_attributes_for, da das zugehörige Modell dort erstellt wurde, wenn verschachtelte Attribute übergeben wurden. Am Ende habe ich es getan
after_create :ensure_profile_exists has_one :profile accepts_nested_attributes_for :profile def ensure_profile_exists profile || create_profile end
quelle