2012-10-01 27 views
16

カテゴリのリストがあります。アイテムには位置があり、カテゴリにはhas_many:items、:order => "position"の関係があります。ユーザーがポジション値を更新すると、そのポジションが表示されます。私の位置は、丸められた数字間を移動できる浮動小数点です。rails - 保存後の関連付けを更新する方法

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 

上記は機能しますが、実際は冗長です。アイテムの保存時に、カテゴリの関係を変更する必要があるため、注文を変更することができるため、更新する必要があります。

答えて

25

item.reloadを使用してデータベースからモデルを再取得し、次にアソシエーションを呼び出すと、そのモデルを再取得します。

4

Rails 4は、変更されたときにhas_many/belongs_to関連オブジェクトを更新しますが、クエリを再実行することはありません。つまり、category.itemsのアイテムが更新されても、 。あなたのテーブルのサイズに応じて、rubyを使って結果を並べ替えるか、category.reloadを使って順番に取得したいかもしれません。

http://guides.rubyonrails.org/association_basics.htmlでRailsGuidesを参照して、単一項目アソシエーションのinverse_of

32

を探して:他の団体については

book.reload_author 

author.books.reload 

http://guides.rubyonrails.org/association_basics.html#controlling-caching


以前のバージョンのRailsでは、Rails 5より前に、trueをアソシエーションメソッドに最初のパラメータとして渡してリロードすることができました:author.books(true)

+2

検索からこの回答に引き続き(私がやったように)誰が:この動作はもはやレールによってサポートされていません。非推奨の警告が表示されます。コレクションの新しい方法は、コレクションプロキシで 'reload'メソッドを使うことです。 – klaustopher

+0

@klaustopherありがとう。私の答えを更新しました。 –

+1

"DEPRECATION警告:アソシエーションを強制的に再ロードするための引数を渡すことは廃止され、Rails 5.1では削除されます(代わりに

から呼び出されます:2)" – Dorian

関連する問題