如何在ActiveRecord中定义没有外键的关系?

时间:2013-04-09 16:43:06

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

我有三张桌子

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

1 个答案:

答案 0 :(得分: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

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