【问题标题】:Configure Rails app to work with existing database配置 Rails 应用程序以使用现有数据库
【发布时间】:2012-12-16 15:14:25
【问题描述】:

我有一个使用现有网站和 mysql 后端的新项目。现在,现在的网站是用 php 编写的(没有框架,哎呀),mysql 表不遵循任何约定。例如,表名并不总是复数,每个表的唯一标识符并不总是称为id,而是类似c_id,有时created_at 和updated_at 没有时间戳字段,如果有,它们有不同的名称.

现在我想在 Rails 中为网站构建一个管理面板,它将访问相同的数据库。我有两个选择:

  1. 更改数据库以遵循 Rails 约定并相应地修改 php 应用程序和所有查询
  2. 以某种方式告诉 Rails,它应该将 `c_id` 之类的内容视为 `id`,将单数名称视为复数名称,等等。

当然,第一个选项在技术上是可行的,但可能是一个巨大的痛苦。这就是为什么我肯定更喜欢第二种选择的原因,并且想知道如果每个模型不遵循约定,是否有可能告诉 Rails 如何处理事物。在我看来,这看起来像:

class ModelClass < ActiveRecord::Base
  treat :user, as: :users
  treat :user.u_id, as: :id
  treat :user.created, as: :created_at if exists
  treat :user.last_update, as: :updated_at if exists
end

这只是伪代码,但你明白了。这样的事情可能吗?

【问题讨论】:

标签: mysql ruby-on-rails activerecord naming-conventions


【解决方案1】:

与您所建议的完全不同,但您可以随意调用模型/列/关联。

class User
  set_table_name 'user' # instead of default "users"
  set_primary_key :c_id # instead of default "id"
end

【讨论】:

  • 看起来不错 - Rails 会知道自动设置 id 吗?我将如何处理时间戳字段并找出它们是否存在?
  • 你不会的。你可以这样做,那些已经被烘焙了。充其量你可以设置你自己的after_save回调来更新时间戳。
  • 当然,只是有时它们以不同的名称存在,有时它们根本不存在。我想我将不得不为此创建迁移。 Rails 会知道在调用 c_id 时自动设置 id 吗?该命令用于创建和更新的设置是什么?只是 set_created_at?
  • 不,正如我所说,你不能这样做。您必须设置一个after_save 回调来手动更新您自己的时间戳。您不能更改它们的名称,它们被硬编码为 created_at/onupdated_at/on
猜你喜欢
  • 2014-03-20
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
相关资源
最近更新 更多