2016-12-15 2 views
3

Ich schaffe eine foo obeject wie folgt aus:Overriding ApplicationRecord initialisieren, schlechte Idee?

@foo = Foo.new(foo_params) 
@foo.bar = Bar.where(name: "baz").first_or_create 

Aber es gibt auch andere Objekte, die ich brauche, wird dies auch tun. Also, dachte ich an das Überschreiben der Foo Methode initialize, so etwas zu tun:

class Foo < ApplicationRecord 
    def initialize(*args, BarName) 
    @foo = super 
    @foo.bar = Bar.where(name: BarName).first_or_create 
    end 
end 

und nennen Sie es wie folgt aus:

@foo = Foo.new(foo_params, "baz") 

Aber Foo ist ein ApplicationRecord und es scheint, dass es nicht empfehlenswert ist Überschreiben der Initialisierungsmethode "ApplicationRecord"

Also wie könnte ich das tun? Irgendwelche anderen Ideen? Würde dieses initialisierende übergeordnete Ding funktionieren?

Antwort

4

Sie können active record callbacks dafür verwenden. Sie werden jedoch nicht in der Lage sein, bar_name zu spezifizieren und müssen es irgendwie dynamisch von Foo-Attributen finden.

Wenn diese Option funktioniert. Fügen Sie Ihrem Modell etwas wie den folgenden Code hinzu.

after_initialize :set_bar 

# some other code 

def set_bar 
    name = # dynamicly_find_name 
    self.bar = Bar.where(name: name).first_or_create 
end 

Falls Sie wirklich brauchen bar_name angeben, würde ich vorschlagen, ein Verfahren für sie zu schaffen.

Foo.new(params).with_bar

def with_bar(bar_name) 
    self.bar = Bar.where(name: BarName).first_or_create 
end 
3

Sie können den after_initialize Rückruf machen und Transienten verwenden, falls erforderlich:

class Foo < ApplicationRecord 
    after_initialize :custom_initialization 

    attr_accessor :barname 

    def custom_initialization() 
    self.bar = Bar.where(name: self.barname).first_or_create 
    end 
end 

Die Anwendung Aufzeichnungen eigene Initialisierung Versorgung nehmen sollte barname der Einstellung in den params ist

+1

Ich würde nur vorschlagen, verwenden Sie 'attr_accessor' für' barname' –

+1

wahr ... das wäre besser r .. Ich werde die Antwort entsprechend ändern. Ty @ NikitaMisharin für die Eingabe. – David

Verwandte Themen