Sql Rails 3,活动记录。如何从中获取对象';s嵌套值

Sql Rails 3,活动记录。如何从中获取对象';s嵌套值,sql,ruby-on-rails-3,activerecord,Sql,Ruby On Rails 3,Activerecord,我使用的是Postgres,SQL(工作)如下: SELECT distinct(users.id), users.* FROM public.addons, public.containers, public.users WHERE ( (addons."value" = 'Something' AND addons."name" = 'bob') OR addons."value" = 'Something else' AND addons."name" = 'bill') AND

我使用的是Postgres,SQL(工作)如下:

SELECT 
distinct(users.id),
users.*
FROM 
public.addons, 
public.containers, 
public.users
WHERE 
( (addons."value" = 'Something' AND addons."name" = 'bob') OR
addons."value" = 'Something else' AND addons."name" = 'bill') AND 
(containers.id = addons.site_id AND 
users.id = containers.user_id)
我要做的是格式化它,以便它返回一组用户对象。我不确定如何设置格式,使其类似(不工作):


这可能吗?

首先,您应该理解DISTINCT不是一个函数,它是一个查询修饰符。括号不会改变这一点。DISTINCT意味着如果有任何行返回的每一列都相同,则将重复项减少为一行。您不能将单个列中的每个不同值减少到一行(这是GROUPBY的工作)

其次,SQL结果集每行每列有一个值。您可以进行某种聚合字符串连接,比如MySQL的GROUP_CONCAT或an,但随后您得到了一个将所有值混合在一起的字符串,在获取它之后,必须在Ruby代码中分解它

因此,如果要为给定的
users.id
获取多行,只需让他们以多行返回应用程序即可。然后对应用程序中的数据进行一些后处理。循环获取行,并将属性逐个添加到Ruby对象。如果要在给定查询中获取多个用户id的数据,请将属性填充到用户对象的散列中,由用户id设置关键字。这样,就不需要按任何特定顺序获取行


第三,我从您的“名称”和“值”列推断您正在使用设计,其中用户有多个属性,每行一个。这是一种颠覆传统关系数据访问的设计,因此您最终必须编写应用程序代码来预处理和后处理数据。如果您可以将每个属性放入其自己的常规列中(这是存储数据的关系方式),您的SQL查询就会简单得多。

您可以将其放入User.find\u by\u SQL(…)中。只是需要逃离“s”。没有我想要的那么整洁,但确实起作用。
@users = User.find(:include => [:users, :containers, :addons], :conditions => {( (addons."value" = 'Something' AND addons."name" = 'bob') OR
    addons."value" = 'Something else' AND addons."name" = 'bill') AND 
    (containers.id = addons.site_id AND 
    users.id = containers.user_id) } )