10

Wenn ich einen 'belongs_to Verband in einem Modell habe, würde Ich mag den fiktiven Unterschied zwischen der Validierung einer Assoziation wissen:Rails 4: Unterschied zwischen validiert Präsenz auf id oder Vereinigung

class Topping < ActiveRecord::Base 
    belongs_to :pancake 
    validates :pancake, presence: true 
    ... 

und Validierung der assoziierten Modell-ID:

class Topping < ActiveRecord::Base 
    belongs_to :pancake 
    validates :pancake_id, presence: true 
    ... 

Motivation:

einiger Code, der eine Topping auf einen Pfannkuchen zugewiesen gestoppt zu einem bestimmten Zeitpunkt in der Vergangenheit arbeiten. Die Änderung der Validierung von der Assoziation zur ID 'fixierte' das Problem, aber ich würde gerne den tieferen Grund wissen, warum.

(FYI, wenn sie in den Code schrittweise die Pfannkuchen war gültig und in der Datenbank und der Belag reagiert sowohl auf .pancake und .pancake_id geeignet. Sowohl die Push-Operator (pancake.toppings << topping) und manuelle Zuordnung und speichern (topping.pancake = pancake; topping.save) scheiterte mit einem Pfannkuchen . fehlende Validierungsfehler)

Antwort

3

Untersuchung weiter, fand ich, dass die 'Präsenz' Validator 'add_on_blank' löst:

http://apidock.com/rails/ActiveModel/Errors/add_on_blank

def add_on_blank(attributes, options = {}) 
    Array(attributes).each do |attribute| 
    value = @base.send(:read_attribute_for_validation, attribute) 
    add(attribute, :blank, options) if value.blank? 
    end 
end 

Das tut, was es sagt: fügt einen Fehler bei der Überprüfung, ob die Eigenschaft in Frage blank? ist

Das bedeutet, es ist einfach eine Existenzprüfung. Wenn ich also eine ID validiere, muss diese ID existieren. Das bedeutet:

topping.pancake = Pancake.new 
topping.valid? 

würde false zurückgeben. Jedoch:

topping.pancake_id = -12 
topping.valid? 

würde True zurückgeben. Auf der anderen Seite, wenn ich das Objekt validiere, wäre das genaue Gegenteil wahr. Sofern nicht -12 ein gültiger Index ist, würde ActiveRecord sie beim Empfang der "Pfannkuchen" -Nachricht automatisch aus der Datenbank laden.

Bewegen Sie sich auf meine Frage, zeigten weitere Untersuchungen, dass blank? Delegierten empty?, und in der Tat jemand empty? auf dem Pfannkuchen definiert hatte, wahr Rückkehr, wenn es keine Spitzen sind.

Schuldige gefunden, und etwas über Rails gelernt.