4

我在 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在哪里相等。是一个关系,我仍然可以向它添加子句,所以我还不想在数据库上运行查询。我将如何做到这一点?eventsbrowser_idbrowsers.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
4

2 回答 2

2

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

于 2010-06-08T18:15:02.627 回答
0

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 + <number of rows in first table> + <number of rows in second table>...

这是一个需要 1750x 的示例,includes只要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-07-24T10:35:33.040 回答