【问题标题】:rails 3: database queryrails 3:数据库查询
【发布时间】:2011-07-29 22:52:06
【问题描述】:

我有一个带有 name:string 和其他属性的 Artists 模型。但是我在同名下有多个艺术家条目。

有没有办法拉出一组艺术家对象而不重复名称?

我找到了仅使用 name 属性的方法,但没有找到可以获取整个艺术家对象的方法。

这些都只是 name 属性:

@artists = Artist.select('DISTINCT name').all
@artists = Artist.all.collect{ |a| a.name }.uniq

【问题讨论】:

    标签: sql ruby-on-rails database ruby-on-rails-3


    【解决方案1】:

    Activerecord 组可以满足您的需求:Artist.group(:name).all

    【讨论】:

    • 非常感谢,我给出了这个答案,因为它的基准测试比上述答案好 50%。谢谢。
    【解决方案2】:

    我的 rails 3 不太好,但仍然有 rails 2 的语法。

    @artists = Artist.find(:all, :select => 'DISTINCT name')
    

    然后我们可以得到一些 Rails 3 的爱。

    【讨论】:

    • 可能太过时了,我得到:ArgumentError: Unknown key(s): distinct
    • 我认为这与我上面所做的相同,它返回 [#, #] 但不是整个艺术家对象,还是我错过了什么?
    【解决方案3】:

    一种方法是获取不同行的 id 并从那里获取其余数据:

    Artist.where('artists.id IN (SELECT MIN(a.id) FROM artists AS a GROUP BY a.name)').all
    

    【讨论】:

    • 您好,这看起来确实完成了我正在寻找的内容,您能否再解释一下发生了什么以及有多少请求?
    • 它首先按名称对所有内容进行分组(重复的名称都在一个组中)并从这些组中获取最低的 id(内部选择),然后获取具有这些 id 的所有艺术家。它仍然只是 1 个 sql 查询,但数据库会进行更多处理以避免重复。确保在名称列上有一个索引。如果您总是忽略重复的艺术家,您可能需要首先考虑阻止他们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 2016-04-25
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多