2015-03-19 172 views
0

我正在创建一个应用程序,在此之后必须先显示标记的图像,之后我必须显示正常图像,之后我必须显示被拒绝的图像,现在我使用3种不同的查询,然后将其收集到一个数组中,它看起来像一个错误的实现,是否有一个查询将帮助我实现下面提到的功能,以便我也可以使用它分页。Rails活动记录查询按特定顺序获取数据

我目前的实施情况如下。

images = [] 
images << @campaign.pictures.where("is_pinned = ?", true) 
images << @campaign.pictures.where("is_pinned = ? AND is_rejected = ?", false, false) 
images << @campaign.pictures.where("is_rejected = ?", true) 

回答

0

如果你想在一个查询/线,您目前通过SQL字符串来做到这一点:

images = @campaign.pictures.where("is_pinned = ? OR (is_pinned = ? AND is_rejected = ?) OR is_rejected = ?", true, false, false, true) 

将会有另一种选择once the or method is introduced in Rails 5

除此之外,如果你不关心效率,你可以让它看起来与哈希语法稍微漂亮:

images = [] 
images << @campaign.pictures.where(is_pinned: true) 
images << @campaign.pictures.where(is_pinned: false, is_rejected: false) 
images << @campaign.pictures.where(is_rejected: true) 
+0

我已经尝试了上面的查询,但它没有按照正确的顺序安排数据,因为我需要 – 2015-03-20 06:54:17

0

上的ActiveRecord ::关系只是为了:

images = @campaign.pictures.order('is_pinned desc, is_rejected') 

现在images是ActiveRecord :: Relation的一个实例,您可以对它进行分页。

关键在于订单条款。

注意:我认为你不能同时记录固定和拒绝记录,如果不是,你的初始解决方案可能有重复。

+0

我可以做到这一点,但在这种情况下,我将首先获取固定图像,然后我会得到被拒绝的图像,我首先需要固定的图像我需要正常的图像,然后我需要被拒绝的图像 – 2015-03-20 06:56:09

+0

如果你有一个'''default_scope''在模型上定义了一个顺序(使用'''reorder '''而不是'''order''')。或者,您在该字段上有空值。或者,也许你在这两个领域都没有虚假记录(普通图像?)。但是,我认为这个顺序给出了你原来的'''images'''数组的相同顺序。 – 2015-03-20 10:42:40