【问题标题】:Rails: Getting an array of object ids by query/conversion (for comparision)Rails:通过查询/转换获取对象ID数组(用于比较)
【发布时间】:2011-04-07 16:31:51
【问题描述】:

基本上,我想要一个来自数据库的 id 数组。

一些背景:

  • 我正在使用一个复选框向用户呈现一个对象列表 (foos)。
  • 如果用户选中该框,则会在不同的表(栏)中创建一行
  • 在呈现 foo 列表 + 复选框时,我想检查任何给定 foo 的唯一 id 是否已经存在于 bar id 数组中。

我假设在渲染带有复选框的 foo 列表时,获取一个 id 数组将比为每个 foo 实例查询数据库更有效。

想法?如果不清楚,请提前道歉。

【问题讨论】:

    标签: ruby-on-rails database optimization


    【解决方案1】:

    我们也可以这样使用map方法

    Model.all.map(&:field_name)
    

    【讨论】:

      【解决方案2】:

      Rails 的最新版本支持Model.pluck(:field_name)

      【讨论】:

        【解决方案3】:

        我使用了map方法:

        @bars = Bar.all(:select => bar.id)
        @bars = @bars.map{|bar| bar.id}
        

        然后我得到了一个 id 数组。而且只有一个查询。

        【讨论】:

        • 这是非常低效的内存,因为它实例化了 Ruby 内存中的所有Bar 记录,只是为了得到一个列。你最好使用#pluck 例如Bar.all.pluck(:id) 返回 ID 列表。
        【解决方案4】:
        array1 = User.all.collect(&:id)
        

        array1 具有表 Users 中所有 id 的值。

        【讨论】:

          【解决方案5】:

          有什么问题吗?如果您有 rails has_manyhas_and_belongs_to_many 关联,rails 将为您获取 id。详情见relevant tutorial,简而言之就像@order_ids = @customer.order_ids

          否则,您可以轻松使用普通 sql(或活动记录查询)。

          【讨论】:

          • 我知道 has_many 等。但同样,您正在为每个 foo 进行关联查询,这似乎不如预先获取所有条形 ID 然后进行比较有效。
          • @cbrulak 当您调用“order_ids”时,rails 不会对每个结果运行查询。再一次,你总是可以切换到 sql:"select id from my_table where ..."。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-09-09
          • 2011-05-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-23
          相关资源
          最近更新 更多