2013-07-29 100 views
0

我試圖建立一些關係,在我的Rails應用4,但我「遇到了一些麻煩,M I有四節課如下:紅寶石4路的關係上軌

class Client < ActiveRecord::Base 
    has_many :checks 
    belongs_to :tier 
    has_many :months 
end 

class Check < ActiveRecord::Base 
    belongs_to :client 
    belongs_to :group, class_name: "Month" 
end 

class Tier < ActiveRecord::Base 
    has_many :clients 
    has_many :months 
end 

class Month < ActiveRecord::Base 
    has_many :clients 
    belongs_to :tier 
    has_many :checks, ->(month) { where deposit_date: month.start_date..month.end_date } 

    validates_uniqueness_of :group, scope: :tier_id 
end 

編輯:爲了澄清,有三個'層'具有不同的月份結構,例如,第1層的'1月'將從第1層開始,第2層將從第3層開始,依此類推,其設計使得只有三層(即三個不同的月份結構),客戶將只有一個層級,但通過這個層級需要多個月。對月份表格還有一個限制,以確保同一層級每月不超過1個條目。本質上是啊幾個月和客戶之間的abtm關係,但客戶所在的層次決定了它迴歸的「團體」。

表格的設置方式使客戶端和月份都有一個tier_id外鍵,支票有一個client_id外鍵和一個存款日期,一個月有一個tier_id和一個開始日期和結束日期。層級表或多或少是層級名稱(層1,層2)的佔位符,旨在將客戶與他們的月份結合起來。我希望能夠描述@ client.months,它會在表中找到匹配客戶端層的所有月份。此外,我想做一些類似@ month.checks的事情,它會查找特定月份中爲特定客戶發佈的所有支票。但我遇到了各種麻煩。

所以我想知道是否有辦法讓我當前的模式工作,如果我需要做出改變,或者如果我需要從頭開始重新考慮整個事情!而且,更重要的是,如何到達那裏....

編輯

的什麼,我想從數據庫返回的將採取以下形式在SQL的一個例子:

SELECT ch.* 
FROM clients cl 
JOIN tiers t ON cl.tier_id = t.id 
JOIN months m ON m.tier_id = t.id 
JOIN checks ch ON ch.client_id = clients.id 
WHERE clients.id = ? AND m.group = ? 

,或者更簡單地說:

SELECT ch.* 
FROM clients cl 
JOIN months m ON m.tier_id = cl.tier_id 
JOIN checks ch ON ch.client_id = clients.id 
WHERE clients.id = ? AND m.group = ? 
+1

belongs_to應該總是單數......'belongs_to:tier' – SteveTurczyn

+0

感謝您的更正! – user1706938

+0

你能解釋一下實際的層次嗎? – depa

回答

0

刪除tier_id雖然我並沒有意識到它,我無意中在這裏解決了一個小問題來回答我自己的問題:Rails relationships with foreign key between?

正如我在我的答案中所述,雖然這給出了m e我想要的東西,它不像'Rails Way',所以我很樂意提供有關如何改進解決方案的建議。

1

你的說明,它說明了層是連接客戶和月的中間模型。

因此,您可以在層上引用客戶端和月表,這意味着層表應該具有client_id和month_id。

如果您之前已經從客戶表中刪除tire_id,並且同樣也從月表中刪除tier_id。

,並與的has_many的模型關聯:通過如下關係,這樣你就可以訪問client.months月。客戶

class Client < ActiveRecord::Base 
    has_many :checks 
    has_many :tiers 
    has_many :months, through: :tiers 
end 

class Tier < ActiveRecord::Base 
    belongs_to :client 
    belongs_to :month 
end 

class Month < ActiveRecord::Base 
    has_many :tiers 
    has_many :clients, through: :tiers 
    has_many :checks, -> { where deposit_date: start_date..end_date } 
end 

class Check < ActiveRecord::Base 
    belongs_to :client 
    belongs_to :group, class_name: "Month" 
end 

注:
*添加CLIENT_ID和month_id到層表
*從月表中刪除tier_id
*從客戶表

+0

我可以理解這種方法,但是它會使分層表的大小和冗餘度增加,並增加每個客戶端和月份,而在我看來,它應該只有3行。我已經考慮完全繞過層級表,並用新的client_months表建立月與客戶之間的關係 - 這會不會更有意義? – user1706938

+0

如果除了映射兩個表格之外,還有其他所需的字段,那麼您可以使用has_many,或者您可以簡單地使用HABTM – user2801