Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Неправильное поведение isDirtyProperty в AR #60

Open
p-kislitskiy opened this issue Apr 24, 2012 · 3 comments
Open

Comments

@p-kislitskiy
Copy link
Contributor

При полном импорте объекта в реквест (напр., при сабмите формы) все не строковые поля помечаются как "грязные" даже если они не изменялись. Происходит это из-за тождественного сравнения старого и нового значения в _setARField.

@korchasa
Copy link

Можешь набросать тест? Тождественное сравнение должно подходить для любых простых типов.

@p-kislitskiy
Copy link
Contributor Author

Смысл в том, что в данном примере все поля в реквесте приходят как string и сравнение 200 === '200' вернет false, т.е. поле якобы изменено.

В принципе, чтобы isDirtyProperty возвращало верное значение и для поддержания BC достаточно в _setARField заменить
($old_value === $value)
на
!is_object($old_value) && ($old_value == $value)
(Правда при этом composed_of отношения как и сейчас будут всегда помечаться как "грязные".)

@korchasa
Copy link

Мне не очень нравится такое решение, т.к.

  1. мы нарушим существующее поведение isDirtyProperty, которое является публичным
  2. не хочется уменьшать строгость в отношении типов

Я сейчас вижу 4 способа решения:

  1. Оставить как есть
  2. Сделать переключатель по методу сравнения
  3. Вынести сравнение в отдельный метод, который легко можно будет перекрыть
  4. Делать сравнение на основе типа из БД

4-ый вариант мне кажется наиболее правильным, но он требует больших изменений.

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants