2016-07-07 6 views
0

私のレールアプリでは、レコードの配列(私は思います)であるcollectionproxyがあります。私は配列の真ん中から記録をとり、最初にそれを入れたいと思う。私はアイテムの位置を知らないが、私はそれをユーザーモデルの属性を使って見つけることができる。いくつかのメソッドがcollectionproxyで使用できないようです。レールでcollectionproxy内のレコードを移動する方法

は、私が試した:

user_images = user.images 
user_images.insert(0, user_images.delete(user.images.find_by_id(user.primary_image_id)) 

が、私は2つの引数を与えたエラーを得たが、それはアレイで使用されているinsertメソッドがcollectionproxiesに使用されるのと同じ方法をイマイチので、私は推測している1を期待しました。これを行う最善の方法は何ですか?

編集:アイテムをビューに表示するだけで、データベースレベルで変更する必要はありません。

+0

データベースレベルで変更するか、ビューに表示するだけですか? – Sravan

+0

@sravanちょうどビューに表示する – user4584963

+0

どのアイテムを最初に置いておきたいですか? – Sravan

答えて

2

コレクションプロキシで利用できるメソッドはほとんどないため、まずコレクションプロキシを配列に変更して操作します。ここで

は、我々がここで行っている魔法がdetectアンシフトが最初にオブジェクトを追加配列 にユーザーとunshiftの主要な画像だ画像である

user_images = user.images.to_a //converted collection to array 
user_images.unshift(user_images.detect{ |image| image.id == user.primary_image_id}).uniq //used unshift 
puts user_images 

、そうするためのコードです。 uniqを使用して、既にそこにある重複したオブジェクトを削除してください。

これは、必要なオブジェクトが最初に配列に入っているため、アクティブレコードコレクションが使用されているため、ビューでこれを使用できます。

+0

配列に変換するとビューのために一時的に保存され、activerecordの順序は変更されません。 – user4584963

+0

はい、アクティブレコードの順序はdbですか? – Sravan

+0

配列に変換することでビューの最初にプライマリイメージを表示することができます – Sravan

0

現在、CollectionProxyの先頭に追加する方法はないようです。 prependおよびsortの方法を削除した。あなたはこのわずか再と思うし、コレクションの最後に要素をコピーして、途中からそれらを削除するdeleteとともにappendまたは<<演算子を使用することができ http://apidock.com/rails/v4.2.1/ActiveRecord/Associations/CollectionProxy/prepend

:ここでは非推奨prepend方法のためのAPIです。それは理想的ではありませんが、よりよい解決策が得られるまで回避策になるかもしれません。

+0

基本的には、最初から始めて、最後まですべてを最後まで移動して、最初から必要な要素をスキップする必要があります。あなたは要素の同じ順序で終わるでしょうが、最初はスキップされていなければなりません。 –

関連する問題