我正在使用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)
我想要做的是格式化它,以便它返回一组用户对象。我不确定我是如何格式化这样的(如果不工作):
@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) } )
这甚至可能吗?
答案 0 :(得分:2)
首先,你应该明白DISTINCT不是一个函数,它是一个查询修饰符。括号不会改变它。 DISTINCT表示如果返回每个列的行相同,则将重复项减少为单行。您不能在单个列中将每个不同的值减少到一行(这是GROUP BY的工作)。
其次,SQL结果集正确地每列每行有一个值。您可以执行某种聚合字符串连接,例如MySQL的GROUP_CONCAT或equivalent aggregate function in PostgreSQL,但是您有一个字符串将所有值混合在一起,然后在获取它之后必须在Ruby代码中爆炸。< / p>
因此,如果要为给定的users.id
提取多行,请让他们以多行方式返回应用。然后对应用程序中的数据进行一些后处理。循环获取行,并逐个将属性添加到Ruby对象。如果您在给定查询中获取多个用户ID的数据,请将属性填充到用户对象的哈希值中,并按用户ID键入。这样您就不需要按任何特定顺序获取行。
第三,我推断你正在使用Entity-Attribute-Value设计的“名称”和“值”列,其中用户有多个属性,每行一个。这是一种颠覆传统关系数据访问的设计,因此您最终必须编写应用程序代码来预处理和后处理数据。如果你可以将每个属性放入它自己的常规列中,这将是存储数据的关系方式,那么你的SQL查询就会简单得多。