Rails 3,活跃记录。如何从嵌套值中获取对象

时间:2011-06-28 23:26:01

标签: 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 
(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) } )

这甚至可能吗?

1 个答案:

答案 0 :(得分:2)

首先,你应该明白DISTINCT不是一个函数,它是一个查询修饰符。括号不会改变它。 DISTINCT表示如果返回每个列的行相同,则将重复项减少为单行。您不能在单个列中将每个不同的值减少到一行(这是GROUP BY的工作)。

其次,SQL结果集正确地每列每行有一个值。您可以执行某种聚合字符串连接,例如MySQL的GROUP_CONCAT或equivalent aggregate function in PostgreSQL,但是您有一个字符串将所有值混合在一起,然后在获取它之后必须在Ruby代码中爆炸。< / p>

因此,如果要为给定的users.id提取多行,请让他们以多行方式返回应用。然后对应用程序中的数据进行一些后处理。循环获取行,并逐个将属性添加到R​​uby对象。如果您在给定查询中获取多个用户ID的数据,请将属性填充到用户对象的哈希值中,并按用户ID键入。这样您就不需要按任何特定顺序获取行。

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