В сеансе консоли, повторяемо, если я обращаюсь к определенному экземпляру модели, извлекая его из массива, я получаю неверные результаты при вызове метода для этого объекта. Однако, если я загружу тот же объект непосредственно из базы данных с помощью find(id)
, тот же метод вернет правильные результаты.
Как это может произойти? Сумасшедшая часть действительно в том, что для первых двух элементов массива все нормально. Как вы можете видеть в конце вывода консоли, результаты для первых двух элементов в массиве (все они одного типа и все имеют два Link
дочерних элементов) имеют смысл. Последние пять не должны быть пустыми.
# Instance from an array
irb(main):417:0> the_array = User.find(89).utterances.select{|u| u.links.count > 1}
=> [#<Utterance id: ...>, #<Utterance id: 6931, ...>, #<Utterance id: 6935, ...>, #<Utterance id: 6944, ...>, #<Utterance id: 6955, ...>, #<Utterance id: 6989, ...>, #<Utterance id: 7014, ...>]
irb(main):418:0> from_array = the_array.last
=> #<Utterance id: 7014, ...>
irb(main):419:0> from_array.class
=> Utterance(id: integer, index: integer, begins_at: float, text: text, created_at: datetime, updated_at: datetime, ends_at: float, recording_id: integer)
irb(main):420:0> from_array.links.class
=> Link::ActiveRecord_Associations_CollectionProxy
irb(main):421:0> from_array.links
=> #<ActiveRecord::Associations::CollectionProxy []>
# Instance from find
irb(main):422:0> from_find = Utterance.find(7014)
Utterance Load (1.8ms) SELECT "utterances".* FROM "utterances" WHERE "utterances"."id" = $1 LIMIT $2 [["id", 7014], ["LIMIT", 1]]
=> #<Utterance id: 7014, ...>
irb(main):423:0> from_find.class
=> Utterance(id: integer, index: integer, begins_at: float, text: text, created_at: datetime, updated_at: datetime, ends_at: float, recording_id: integer)
irb(main):424:0> from_find.links.class
=> Link::ActiveRecord_Associations_CollectionProxy
irb(main):424:0> ap from_find.links
[
[0] #<Link:0x000055fc7f154150> {
:id => 212,
#...
},
[1] #<Link:0x000055fc7f15feb0> {
:id => 213,
#...
}
]
irb(main):425:0>
# But for the first two elements of the array, no problem
irb(main):486:0> the_array.each{|u| puts ap u.links}
[
[0] #<Link:0x000055fc80cc34e0> {
:id => 208,
...
},
[1] #<Link:0x000055fc80cc3328> {
:id => 209,
...
}
]
[
[0] #<Link:0x000055fc80cc7180> {
:id => 211,
...
},
[1] #<Link:0x000055fc80cc6fc8> {
:id => 210,
...
}
]
[]
[]
[]
[]
[]