2013-04-23 85 views
0

我正在構建一個每日交易應用程序,以更好地學習Ruby on Rails。Rails有很多,屬於

關於M.哈特利教程,我瞭解了模型及其關係的概念(微博屬於用戶,用戶has_many微博)。

但是我不確定如何在日常交易項目中付諸實踐。

我決定爲用戶提供模型具有不同權限的兩件式的用戶:

  • admin_user誰可以創建/更新/編輯/刪除交易

  • standard_user誰可以看到交易,如果他們發現一個有趣的參與交易

兩個用戶進入用戶數據庫

我還決定對交易模型,並走在交易數據庫 所以我已深知:

  • 一個admin_user的has_many交易

  • 交易屬於一個admin_user

  • standard_user有很多交易(的確他可以參與很多交易)

  • 並且交易不屬於展位ard_user,所以我在這裏什麼都不能說。

我理解的東西正確嗎?有可能根據對模型對象的用戶不同的關係右側的類型(在這種情況下:交易)來定義

PS:我想我會用康康舞寶石的獨立用戶,給他們不同的權限

回答

2

您所描述的最大問題是standard_user has_many :deals,但交易不屬於standard_user;他們可能同時被許多標準用戶使用。這意味着交易不能belong_to standard_user,因爲您的交易表中不能有standard_user_id列(因爲您需要任意多列來處理可能參與的任意多個用戶)。

爲了有這樣的多對多關係,您需要一個鏈接表。下面是Rails的實現這一目標的一種方法:

class DealParticipation < ActiveRecord:Base 
    #This means the deal_participations table has a standard_user_id key 
    belongs_to :standard_user 
    #This means the deal_participations table has a deal_id key 
    belongs_to :deal 

    #... more logic goes here ... 
end 

現在標準用戶是這樣的:

class StandardUser < ActiveRecord::Base 
    has_many :deal_participations 
    has_many :deals, :through => :deal_participations 
    # ... more logic goes here ... 
end 

而且您的交易類看起來像:

class Deal < ActiveRecord::Base 
    has_many :deal_participations 
    has_many :standard_users, :through => :deal_participations 
    belongs_to :admin_user 
    #... more logic goes here ... 
end 

然後您就需要三個表格:一個用於deals,一個用於deal_participations,另一個用於standard_users(加上管理員用戶的東西)。

根據您的需要,您可能還想嘗試使用單表繼承(STI)使用戶和管理用戶從一個公共基類派生。你可以閱讀更多關於STI here

我希望有幫助!享受Rails入門!

+0

我看到什麼用戶表的屬性如下所示:USER_ID/USER_LOGIN/USER_PASSWORD/user_location.I也看到了交易表屬性:deals_name,deals_price ......但我不明白我放入您提到的deals_participations表中。該表的屬性(列)是什麼?如果它們是:deals_participation_id/user_id/deals_id,那麼我的行數等於用戶數量乘以他們參與的交易數量......這可能是巨大的,並且看起來不太有效。我對deal_participation表屬性有錯嗎? – Mathieu 2013-04-24 21:04:13

+0

deals_participations表的列確實是您所描述的。每次用戶參與交易時都有一行。如果您存儲了用戶參與的用戶交易清單(但是如果您這樣做了,則無法查詢),這與您所擁有的數據量完全相同。這個「鏈接表」設計是解決這個問題的標準方法。 – charleyc 2013-04-24 21:14:38

+0

感謝您的回答。我明白。主要的是我需要能夠檢索數據「哪些交易用戶mathieu45(例子)在過去30天參與」爲了定製電子郵件給他。我擔心查詢這個表格將會太長而且效率低下。 – Mathieu 2013-04-25 09:27:19

0

假設每筆交易都與一個admin_user相關聯,那麼我認爲您前三個子彈是正確的。然而,就你的第四個項目符號而言,你可以使用has_many:through或has_and_belongs_to_many來模擬standard_user和deal之間的關係,如Rails guide所述。在後一種情況下,standard_user的has_many關係處理將更改爲has_and_belongs_to_many。

至於使用用戶子類來定義關係,是的,您可以這樣做,但請參閱http://guides.rubyonrails.org/association_basics.html以獲得關於此方法的一般性討論。

皮特

+0

就像一個警告,我發現has_and_belongs_to_many雖然方便,卻充滿了bug。特別是在複雜的連接上,它有一個錯誤並創建垃圾SQL的趨勢。我已經完全停止使用它來支持'has_many:through'。 – charleyc 2013-04-23 21:27:47

+0

正式注意。非常感謝。來自真實體驗的建議總是非常有用! – Mathieu 2013-04-23 21:33:23

+0

@charleyc我看到用戶表的屬性如下:user_id/user_login/user_password/user_location。我也看到deals表的屬性:deals_name,deals_price ...但我不明白我會把什麼放在您提到的deals_participations表。該表的屬性(列)是什麼?如果它們是:deals_participation_id/user_id/deals_id,那麼我的行數等於用戶數量乘以他們參與的交易數量......這可能是巨大的,並且看起來不太有效。我對deal_participation表屬性有錯嗎? – Mathieu 2013-04-24 20:59:20