2009-10-01 60 views
2

我想在新客戶註冊使用我們的Web應用程序後,在我的數據庫中填充各種表。我想知道做這件事的最好方法是什麼,主要的要求是它不應該需要我的任何干預。大部分數據都是靜態的(但可以稍後由客戶進行更改(比如偏好)),但顯然需要客戶的ID作爲將創建的記錄鏈接到該客戶的一種方式。在「註冊」後填充數據庫

我認爲把一些

Object.create(:customer_id => @customer.id, :yummy => "maybe", :etc => true)

語句在處理註冊等控制器,但告訴我,惱人的小警鐘,有一種更好的方式再次拉響了!

在此先感謝您的任何建議!

GAV株系

回答

2

在你的控制器

class AccountController < ApplicationController 
after_filter :populate_db :only=>[:register] 
    def populate_db 
    # whatever stuff 
    Account.populate 
    end 
end 

並把邏輯模型中:

class Account < ActiveModel::Base 
    def populate 
    # your logic 
    end 
end 
+0

不錯,乾淨,非常感謝你! – Gav 2009-10-01 09:33:02

0

兩種方式

  1. 在你的數據庫的觸發器功能,這是否
  2. 回調在用戶模式上創建
3

與khelll的解決方案的問題是,如果你創建的寄存器的操作(例如,管理員模塊)以外使用新的帳戶,它的數據庫韓元不會被填充。

所以我寧願像下面這樣:

class Account < ActiveModel::Base 
    def after_create 
     populate 
    end 

    private 
    def populate 
     # Your logic 
    end 
end 

的after_create回調將之後的任何帳戶創建調用。
這是更多的MVC和DRY兼容;)

+0

這是一個很好的解決方案,但前提是該事件與賬戶創建完全相關。 – khelll 2009-10-01 09:43:22

+0

很明顯,Gav需要在帳戶創建時填充他的數據庫。 無論如何,如果您需要在每次保存您的帳戶時填充它,after_save回調會執行此操作。 – 2009-10-01 13:47:40

+0

這將是一個「業務邏輯」來決定何時填充數據庫,因此讓它在模型中而不是在控制器中對我來說也更合理。無論是after_create事件還是隱藏在模型函數內的其他地方。 – Priit 2009-10-01 20:08:22

0

你可以不只是在數據庫中設置默認值?

+0

很遺憾沒有。在創建帳戶時,許多表需要默認創建多個記錄,因爲其他應用程序邏輯依賴於此數據正常工作。 – Gav 2009-10-01 10:07:14

-1

@Omar Qureshi 你不應該在你的數據庫中使用觸發器功能 - 它們可以完成許多功能,但ActiveRecord是數據庫不可知的,並且它具有處理觸發器可以處理的事件的回調函數。使用將您鏈接到特定數據庫系統的東西是錯誤的。

@ dmathieu的答案似乎是最好的。而且你應該考慮使用Factory女孩 - 這是填充數據庫的好工具。

+0

使用將您鏈接到特定數據庫系統的東西比錯誤更多。也許你應該研究一下數據庫性能調優。很少有業務應用程序需要與數據庫無關。 – HLGEM 2009-10-01 18:59:56

+1

5年後,如果您不使用Ruby on Rails,而是使用超級品牌嶄新框架(Java in Jails?),那麼您在回調中編寫的代碼現在僅用於引用然而,在生命中稍後重複的時候,你現在使用的數據庫變化的可能性要小得多(可能你永遠不會改變你的數據庫),因此你以前使用的觸發器現在仍然是有價值的。 我認爲這是「框架不可知論」? – 2009-10-01 23:06:23

+0

Java in Jail ...經典:-) – Gav 2009-10-02 08:33:01

0

我在註冊期間使用YAML文件填充數據庫中的十多個表。這種方法對我來說有一些積極的副作用:

  1. 我可以很容易地改變種子數據的內容爲新帳戶
  2. 這是很容易的添加初始內容的本地化版本,我可以讓YAML文件通過99translations很容易翻譯。com
  3. 我打算稍後在新客戶端可以在註冊期間或註冊後立即導入其數據的位置添加數據導入功能,以便他們可以採用導入文件模板並根據自己的需要對其進行自定義。

已經有一些缺點太:

  1. 不可避免的是,當數據架構更改,有時我不得不修改這些文件的所有本地化版本。
  2. 這是一個醜陋的代碼,我有映射所有新記錄之間的外鍵。也許我可以在這裏使用一些模式描述...

由於我每天約有300個新註冊,所以現在爲我擔心性能還爲時尚早。