【问题标题】:How do I do a join in ActiveRecord after records have been returned?记录返回后如何加入 ActiveRecord?
【发布时间】:2010-06-08 15:17:43
【问题描述】:

我在 Rails 3 中使用 ActiveRecord 从两个不同数据库中的两个不同表中提取数据。这些数据库不能相互连接,但我需要在事后进行简单的连接。我想保留这个关系,这样我就可以把它串起来。

这是我正在做的简化版

browsers = Browser.all # <-- this is fairly small and can reside in memory
events = Event.where(:row_date=>Date.today).select(:name, :browser_id)

如您所见,我想将browsers 加入events 关系中,其中browser_id 应该等于browsers.nameevents 是一个关系,我仍然可以在其中添加子句,所以我还不想在数据库上运行查询。我将如何做到这一点?

编辑

对于那些希望看到我在下面接受的答案的代码的人,这是我想出的:

class EventLog < ActiveRecord::Base
  belongs_to :browser

  def get_todays_events
    Event.where(:row_date=>Date.today).select(:name, :browser_id).includes(:browser)
  end
end

让我通过以下方式获取浏览器名称

get_todays_events.browser.name

【问题讨论】:

    标签: ruby-on-rails ruby activerecord ruby-on-rails-3 activemodel


    【解决方案1】:

    我会通过使用 :include 来实现这一点。尝试在 Ruby 中执行此操作只会让您感到悲伤。您可以链接到包含就好了。

    【讨论】:

    • hmm,新的 rails 似乎在内存中进行连接,而不是将其构建到 sql 查询中。感谢您的提示!
    【解决方案2】:

    joins 在当前 Rails 5 中确实创建了 SQL 连接:

    pry(main)> Customer.joins(:orders).limit(5) Customer Load (0.2ms) SELECT `customers`.* FROM `customers` INNER JOIN `orders` ON `orders`.`customer_id` = `customers`.`id` LIMIT 5 => [#<Customer:0x007fb869f11fe8 ...

    这应该快得多,因为它只需要一个数据库查询,而includes 将执行1 + &lt;number of rows in first table&gt; + &lt;number of rows in second table&gt;...

    这是一个示例,其中includes 需要 1750 倍,只要 joins

    pry(main)> benchmark do
       Order.joins(:address, :payments, :customer, :packages).all.size
    > 0.02456 seconds
    
    pry(main)> benchmark do
    [14] pry(main)* Order.includes(:address, :payments, :customer, :packages).all.map(&:zip).max
    [14] pry(main)*end
    => 35.607257 seconds
    

    【讨论】:

      猜你喜欢
      • 2017-09-14
      • 2016-01-26
      • 2013-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多