使用具有关联记录的特定记录集的种子数据库

时间:2014-01-26 01:53:55

标签: ruby ruby-on-rails-3 ruby-on-rails-3.2

我正在建立一个功能,当一个人注册一个帐户时,我们会自动使用默认类别和项目填充他们的帐户以启动它们。

此外,他们可以选择购买其他类别集,以便随时添加/填充其帐户。

我在想我的选择是:

1)以某种方式使用seeds.rb 2)将这些记录存储在YAML文件中,并在创建帐户时加载 3)将这些记录作为默认设置存储在数据库中并克隆/复制它们。

任何帮助都赞赏w /代码示例让我开始。

3 个答案:

答案 0 :(得分:0)

这就是我要做的: 在数据库中有一个标记以标识first_sign_in将数据存储在yaml文件中(例如db/users.yml)并执行:

def populate_user
  user.update_attributes(YAML.load(Rails.root + 'db/users.yml')) if first_sign_in == 0
end

然后您可以将其添加到after_create挂钩,以便仅在创建user时调用它

答案 1 :(得分:0)

我会采用不同的方式。我在控制器和模型之间有一个“注册”表单对象。在首次构建用户的同时构建一些默认类别和项目。如何隔离这些默认项的属性取决于它们的复杂程度。如果它们很简单,表单对象中的默认哈希就足够了,如果它们很复杂,你可以从YML中获取。

当我在过去完成此操作时 - 有一个需要多个对象创建的注册我有一个RegistrationsController,一个RegistrationForm对象,它接受参数并验证所有内容,并且也是负责知道保存什么,有时在中间Registrar对象(通常是Struct)中,它具有回调的所有逻辑。 registrations_controller初始化registrar,发送消息register(registration_form)

从长远来看,这会导致职责分离和更清晰的代码。

答案 2 :(得分:0)

提供的答案是明确的选择,我试验过。但是,我决定走另一条路。我意识到我需要管理这些模板'记录和数据库最容易。

1)我在桌面上设置了一个列' is_template'标记将用于为其他帐户设定种子的记录。

2)创建了一个after_create回调,使用这些记录为帐户播种。

3)为了方便起见,我使用了amoeba gem,它允许我复制记录及其相关记录,因为它们中的一些具有has_many关系。

到目前为止,这项工作一直很顺利 - 我也有办法让自己和非技术人员更新记录。