2013-04-09 38 views
0

我有三個表如何在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 
+0

如果應用程序有數百個表,那麼您需要重新考慮數據結構。有些東西需要繼承某些東西,或者通過使用類似H-store的東西來減少所需的表的數量http://www.postgresql.org/docs/9.0/static/hstore.html – rovermicrover 2013-04-09 20:14:55

回答

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 

隨着要麼在單位時間戳現在,而不是其他人,或自定義的驗證,以確保所有相關的具有相同的時間戳。

+0

這對於我發佈的場景。現實情況要複雜得多。還有更多的表格和可能的組合。數據量也非常大。對於許多組合來說,維護和處理諸如單元之類的東西太貴了。 – 2013-04-09 18:28:16

相關問題