Skip to content
New issue

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

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

Already on GitHub? Sign in 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
Contributor

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

@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
Contributor

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

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

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

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

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

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

No branches or pull requests

2 participants