2012-05-26 138 views
0

RoR的新功能,但是在構建應用程序時有刺 - 我正在尋找一些關於我的數據庫結構的建議。關於RoR數據庫模式和關聯的建議

我有4個型號/表:用戶>客戶端>工作>任務

該應用程序將工作方式如下:

  1. 用戶將登錄
  2. 他們可以添加客戶端
  3. 他們可以將作業添加到客戶端
  4. 他們可以將任務添加到作業

所以,任務屬於作業,作業屬於客戶,而客戶屬於用戶。

我想查詢任何一個客戶端,任務或任務的數據庫,並確保它屬於當前登錄的用戶。我正在努力編寫一個'railsy'連接查詢和設計我的關聯,所以我可以做到這一點。

我知道這將是超級簡單的,如果我在每個表中都有一個user_id字段,但這似乎不是正確的方式。

我已閱讀http://guides.rubyonrails.org/association_basics.html指南,但我仍然在黑暗中一點點。任何人都可以闡明我如何構建我的數據庫 - 更重要的是我的協會?

Thx。

回答

1

我不知道,如果我理解正確你的問題,但我相信這可能是一個解決辦法:

如果你寫你的協會這樣,ActiveRecord會自動創建如果您要求user.jobsuser.tasks加入。

class User < ActiveRecord::Base 
    has_many :clients 
    has_many :jobs, :through => :clients 
    has_many :tasks, :through => :jobs 
end 

欲瞭解更多信息,請參閱Rails-Api-Documentation

如果你想獲得一切爲了用戶在一個請求。你可以這樣做:

user.clients.joins(:jobs => :tasks) 
+0

非常感謝 - 這實際上是我創建我的關聯的方式。我想我遇到的問題是你的答案的第二部分,即。要求:'user.jobs'。我只是不知道該怎麼做。這是可以回答的嗎? :o) – user1418711

+0

其實,我想我已經明白了。這非常有用 - 謝謝! – user1418711

2

看來你有你的協會從一個側面樹立正確的,所有你需要做的就是使用的has_many加入協會的另一端:

class Task < ActiveRecord::Base 
    belongs_to :job 
end 

class Job < ActiveRecord::Base 
    belongs_to :client 
    has_many :tasks 
end 

class Client < ActiveRecord::Base 
    belongs_to :user 
    has_many :jobs 
    has_many :tasks, :through => :jobs 
end 

class User < ActiveRecord::Base 
    has_many :clients 
    has_many :jobs, :through => :clients 
    has_many :tasks, :through => :jobs 
end 

現在的ActiveRecord會照顧的加入爲你。確實,在純數據庫模式中,不應該在多個地方使用user_id(這裏是客戶端表)。然而有時它也會被添加到任務和作業表中以提高性能,因爲那麼db查詢不會那麼大。儘管如此,你必須付出更多的努力來保證數據的一致性 - 例如,你必須確保某個工作與客戶端具有相同的user_id。除非你注意到的查詢是適合您的需求太慢

class Task < ActiveRecord::Base 
    belongs_to :user 
end 

但在這種情況下,我不會做它:

然後你就可以定義像捷徑關聯。過早的優化是邪惡的:-)

+0

謝謝你。這就是我建立聯盟的原因 - 我想我的問題是,我從這個角度出發轉向錯誤,並且無法查詢數據庫。 – user1418711