Последовательность вызова в рубине - PullRequest
0 голосов
/ 13 июня 2011

У меня есть следующая модель:

class Customer < ActiveRecord::Base
  has_one :cart
end

class Cart < ActiveRecord::Base
  belongs_to :customer

  validates :customer, :presence => true
end

В следующем случае объект Корзина недействителен и не сохранен в БД:

c = Cart.create
c.valid? # false

В следующем случае объект Корзина действителен и сохранен в БД:

c = Cart.create
cus = Customer.create
c.customer = cus
c.valid? # true

В следующем, третьем случае объект Корзина также действителен и сохранен в БД:

cus = Customer.create
cus.cart = Cart.create

Вопрос в том, почему в последнем случае создается действительная запись корзины, которая будет сохранена?

При следовании стековой схеме оценки кода Cart.create подсвечивается перед передачей в метод Customer.cart =. Следовательно, в настоящее время связь Корзины с Покупателем не установлена, и, теоретически, должна быть получена недействительная Корзина, которую не следует сохранять в БД.

Почему происходит сохранение корзины?

Полагаю, объект корзины помечается как "подлежащий сохранению", когда он был создан с помощью метода create и недопустим. При передаче в метод Customer.cart = корзина связывается с покупателем, и вызывается Cart.save, когда корзина помечена как «подлежащая сохранению». Итак, мы получаем модель корзины, сохраненную в БД.

Я прав?

Ответы [ 2 ]

0 голосов
/ 13 июня 2011

<…your hypothesis…>

Я прав?

Да.

0 голосов
/ 13 июня 2011

... / activerecord-3.0.8 / lib / active_record / base.rb: 476 (метод создания)

# Creates an object (or multiple objects) and saves it to the database, if validations pass.
# The resulting object is returned whether the object was saved successfully to the database or not.

также ... / activerecord-3.0.8 / lib / active_record /association.rb: 1003 (метод has_one)

# [association=(associate)]
#   Assigns the associate object, extracts the primary key, sets it as the foreign key,
#   and saves the associate object.
...