如何在rails中的collectionsproxy中移动记录

时间:2016-07-07 04:41:55

标签: ruby-on-rails activerecord

在我的rails应用程序中,我有一个collectionproxy,它是一个数组(我认为)的记录。我想从数组中间取一条记录并将其放在开头。我不知道项目的位置,但我可以使用用户模型的属性找到它。似乎有些方法无法在collectionproxy上使用。

我试过了:

var statusCellTemplate =
'<div class="ui-grid-cell-contents"><span ng-
if="row.entity.statusDetails.length>=2">[Multiple Statuses]</span><span ng-
if="row.entity.statusDetails.length<2">{{row.entity.statusDetails[0].status.name}}
</span></div>';

但得到了一个错误,我给了2个参数,但它预计1.我猜测因为在数组上使用的insert方法与collectionproxies上使用的方法不同。最好的方法是什么?

编辑:我只需要在视图中显示项目,我不需要在数据库级别进行更改。

2 个答案:

答案 0 :(得分:2)

由于很少有方法可用于集合代理,首先将集合代理更改为数组,然后对其进行操作。

以下是执行此操作的代码,

 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

我们在这里所做的魔术是detect用户的主要图像和unshift到数组的图像 unshift在开头添加对象。 现在使用uniq。

删除已存在于某处的重复项目

这就是您所需的对象首先进入数组,您可以在视图中使用它,因为使用了活动记录集合。

答案 1 :(得分:0)

看起来目前无法添加到CollectionProxy的开头。已删除prependsort方法。以下是已弃用的prepend方法的API: http://apidock.com/rails/v4.2.1/ActiveRecord/Associations/CollectionProxy/prepend

您可以稍微重新考虑一下,并使用append<<运算符以及delete将元素复制到集合的末尾,并从中间删除它们。它并不理想,但在您有更好的解决方案之前,它可能是一种解决方法。