我有三张桌子
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
答案 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
现在单元上的时间戳而不是其他时间戳,或自定义验证以确保所有关联的时间戳具有相同的时间戳。