10

Если у меня есть «belongs_to» объединение в модели, я хотел бы знать смысловое различие между проверкой ассоциации:Rails 4: Разница между проверяет наличие на ид или ассоциациях

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

и проверкой связанная модель ID:

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

Мотивация:

некоторый код, который присваивается начинку для блинов перестал работать в какой-то момент в прошлом. Изменение валидации от ассоциации с идентификатором «исправлено» проблема, но я хотел бы узнать более глубокую причину.

(FYI, когда вступает в код блин был действительным и в базе данных и долив ответил на оба .pancake и .pancake_id соответствующего образом. Оба нажимного оператор (pancake.toppings << topping) и ручное назначение и сохранить (topping.pancake = pancake; topping.save) не с блином . отсутствует ошибка проверки)

ответ

3

Исследуя дальше, я обнаружил, что 'присутствие' валидатор решает 'add_on_blank':

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 

Это делает то, что он говорит: добавляет ошибку проверки, если это свойство является blank?

Это означает, что это просто проверка существования. Поэтому, если я проверяю идентификатор, этот идентификатор должен существовать. Это означает:

topping.pancake = Pancake.new 
topping.valid? 

вернется с ошибкой. Однако:

topping.pancake_id = -12 
topping.valid? 

вернется. С другой стороны, если я проверяю объект, то полная противоположность будет истинна. Если -12 - действительный индекс, в этом случае ActiveRecord автоматически загрузит его из базы данных при получении сообщения «блин».

Переходя к моему вопросу, дальнейшее расследование показало, что blank? делегатов empty?, и в самом деле кто-то определило empty? на лепешке, возвращает истину, если нет начинки.

Виновник найден, и кое-что о Rails узнали.