2009-10-01 68 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个新注册,所以现在为我担心性能还为时尚早。