Ответ 1
Вы можете использовать item.reload
, который будет восстанавливать модель из базы данных, и в следующий раз, когда вы вызовете ассоциацию, она восстановит ее.
У меня есть категория со списком элементов. Элементы имеют позицию, а категория имеет отношения has_many: items,: order = > "position". Когда пользователь обновляет значение позиции, я хочу видеть его позицию. Моя позиция - это поплавок, позволяющий перемещаться между округленными числами.
pos=item.category.items.map(&:id)
current_position=pos.index(id.to_i)
item.save # want to refresh the relationship here
pos_new=item.categoty.items.map(&:id)
# grabbing this since just accessing item isn't updated if positioning has changed
item_new=Item.find(id)
pos_new=item_new.category.items.map(&:id)
new_position=pos_new.index(id)
if current_position!=new_position
is_moved=true # sent back in JSON to propagate a dynamic change.
end
Вышеприведенные работы, но это кажется действительно многословным. Есть ли способ, чтобы я рассказывал об элементе, сохраняя, что отношение категории необходимо обновить, поскольку порядок может быть изменен?
Вы можете использовать item.reload
, который будет восстанавливать модель из базы данных, и в следующий раз, когда вы вызовете ассоциацию, она восстановит ее.
Для ассоциаций с одним элементом:
book.reload_author
Для других ассоциаций:
author.books.reload
http://guides.rubyonrails.org/association_basics.html#controlling-caching
В старых версиях рельсов перед Rails 5 вы можете передать true
методу ассоциации в качестве первого параметра, чтобы перезагрузить его: author.books(true)
.
Rails 4 обновит ваш has_many/belongs_to связанные объекты для вас, когда они меняются, но он не будет повторно запускать запрос, что означает, что даже если элементы в category.items будут обновлены, они не будут в порядке. В зависимости от размера ваших таблиц вы можете использовать ruby для заказа результата или использовать category.reload, чтобы привести их в порядок.
Смотрите RailsGuides в http://guides.rubyonrails.org/association_basics.html и найдите inverse_of