2012-05-25 67 views
9

在Rails中,我有一个Product模型。有时我需要同时获得多个products(但该列表完全是动态的,因此无法在Rails一侧完成)。Rails通过ID获得多个

所以,让我们说这个电话,我需要在一次通话中获得产品1,3,9,24。这可能吗?如果是这样,我是否需要一个自定义路由,并且我在控制器中放置了什么?

即做这样的工作? /products/1,3,9,24

+0

您是在谈论控制器/请求级别,还是型号/数据库级别? – x1a4

+0

你将不得不多解释一下。 “Rails方面无法完成”是什么意思? – tybro0103

+0

@ x1a4是,控制器/请求级别。让我编辑。 – Baub

回答

24

我不认为你应该需要改变路线。你只需要在你的控制器/模型中解析它们。

def show 
    @products = Product.find params[:id].split(',') 
end 

如果您随后向http://localhost/products/1,3,9,24发送请求,则@products应返回4条记录。

+1

这个工程! :) 谢谢。 – Baub

+0

感谢解决方案! –

3
Product.where(:id => params[:ids].split(',')) 
+0

这个工作,但路线是不需要的。 – Baub

+1

请注意,通配符捕获所有内容很重要,所以如果您向/ products/1,2,3,4/edit发送请求,params [:ids]将包含'1,2,3,4 /编辑' –

+0

并且你知道,如果你把它放在最后,这是可以的 –

5

我会考虑这个索引的要求在有限的范围,有点像搜索,所以我会做:

class ProductsController < ApplicationController 
    def index 
    @products = params[:product_ids] ? Product.find(params[:product_ids]) : Product.all 
    end 
end 

然后链接到这一个网址数组:

<%= link_to 'Products', products_path(:product_ids => [1, 2, 3]) %> 

这将创建标准的非索引网址阵列,看起来有点像

product_ids[]=1&product_ids[]=2 ... 

希望有所帮助。

+0

完全同意。用'index'动作处理这个请求可能会更适合于其他的控制器逻辑。 – colllin