Dziwne zachowanie active record

Hej, mam taki model:

class Foo
  belongs_to :bar
end

i jak robie:

foo = Foo.create(bar: bar)
foo.bar_id = 5 # inne id, ale poprawne
foo.save # bar_id sie nie zapisuje
foo.reload
foo.bar_id = 5 # inne id, ale poprawne
foo.save # bar_id sie zapisuje

Ale dotyczy to tylko jednej relacji (zmienianie innych relacji w ten sposob dziala

Nie moge pokaz kod (NDA), moze ktos mial podobny przypadek? Mozecie tez podac linki do kodu rails ktory generuje metode bar_id=, moze cos tam znajdziemy, dzieki!

Ja bym zrobił tak:

require 'debugger'; debugger

:wink:

Gdybym tylko mial na to czas… :wink:

AFAIK te metody korzystają z #write_attribute (które wewnętrznie korzysta z kolei z @attribites[]=).

to pierwsze

foo.save 

zwraca true?

  • postaw bomby np. z pry-debuggerem [1], zobacz co przypisuje pierwsze, jakie zapytania idą etc.

[1] https://github.com/nixme/pry-debugger

Najpierw spróbuj create! zamiast create. Może rekord nie jest tworzony z powodu jakiejś walidacji?

Jeżeli to nic nie wyjaśni to warto też sprawdzić wszystkie callbacki (before_*) i walidacje zdefiniowane na tym modelu. Wyłącz wszystkie i zobacz czy problem wciąż występuje.

Rekord sie tworzy. Callbackow nie ma zadnych, i walidacje nie dotykaja tej relacji.

Użyj ‘save!’ żeby zobaczyć czy leci jakiś wyjątek.

Hmm, save zwraca true, ale jest to jakis trop - nie sprawdzalem save. Na pewno jak bedziemy to debuggowac (na razie poprawilismy to robiac #reload) zrobimy wykomentowywanie wszystkiego po koleji, po polowie (bisect).