0

我有三张桌子

prices
   timestamp : datetime
   unit_id   : integer
   price     : decimal

sales
   timestamp : datetime
   unit_id   : integer
   price     : decimal

schedules
   timestamp : datetime
   unit_id   : integer
   status    : string

这些表不属于任何东西,因此 schedules_id 或其他键不起作用。我怎样才能利用 ActiveRecords 关系来获得类似的东西:

class Schedules
   has_one :sale, 
     joins: "LEFT OUTER JOIN ( sales s ) 
             ON ( s.timestamp = schedules.timestamp AND s.unit_id = schedules.unit_id")

   has_one :price
      ...
 end

那么我可以

Schedules.where(timestamp: Time.now).includes([:sales, :prices]).all

实际情况比上面的例子要复杂得多。该应用程序有数百个表。

使用连接有效,但会将属性/值放入计划对象中。

class Schedules
  def self.prices
    select("*").joins("LEFT OUTER JOIN ...")
  end
end

以上将在将prices字段加入时间表时起作用。

s = Schedules.prices.last # will have a price attribute
s.price

但理想的做法是在子对象中加入

s.price.price
s.sales.price
4

1 回答 1

0

为什么不直接创建一个 unti 模型,即使它只是一个 ID 号,然后强制它们要么都具有相同的时间戳,要么只具有单元上的时间戳。无论哪种方式,您最终都会得到相同的结果。

class Price < ActiveRecord::Base

  belongs_to :unit
  has_one :schedule, :through unit
  has_one :sale, :through unit

end

其他两个也一样,然后。

class Unit < ActiveRecord::Base

  has_one :price
  has_one :schedule
  has_one :sale

end

现在使用 Unit 上的时间戳而不是其他时间戳,或自定义验证以确保所有关联的时间戳具有相同的时间戳。

于 2013-04-09T16:53:36.660 回答