Ruby on Rails中使用现有MySQL表的表名与属性映射方案咨询
在Ruby on Rails中映射非规范数据库表与字段
嘿,这个问题我碰到过好多次了,RoR的约定优于配置确实方便,但遇到遗留数据库就需要手动调整映射了,我来一步步教你怎么弄:
1. 关联类名与数据库表名
RoR默认会把驼峰式的类名转换成蛇形复数的表名(比如User类对应users表),但如果你的现有表名不符合这个规则,直接在模型类里指定表名就行:
打开你生成的模型文件(比如app/models/your_model.rb),添加一行代码:
class YourModel < ApplicationRecord # 替换成你的实际数据库表名 self.table_name = "your_non_standard_table_name" end
注意:如果你的表主键不是默认的id字段,一定要额外指定主键,否则RoR会抛出找不到主键的错误:
self.primary_key = "your_table_primary_key_column"
2. 映射类属性与表字段
对于不符合RoR命名规范的字段(比如数据库里的usr_phone,你想在代码里用phone),可以用alias_attribute来创建别名映射,同样在模型类里添加:
class YourModel < ApplicationRecord self.table_name = "your_non_standard_table_name" self.primary_key = "your_primary_key" # 格式:alias_attribute :你想用的属性名, :数据库里的字段名 alias_attribute :phone, :usr_phone alias_attribute :full_name, :cust_fullname alias_attribute :signup_date, :reg_date end
这个别名是双向生效的:你读取@model.phone会获取usr_phone的值,修改@model.phone = "123456"也会同步更新到usr_phone字段。
结合Scaffold生成的页面调整
因为你已经用scaffold生成了页面,需要把视图里的字段名改成你定义的别名:
- 比如视图里原来的
<%= @model.usr_phone %>要改成<%= @model.phone %> - 表单里的
f.text_field :usr_phone要改成f.text_field :phone
这样前端页面就能和你配置的映射对应上了。
完整示例
假设你有个遗留表叫legacy_users,字段是user_id(主键)、usr_name、usr_email,想创建User模型来映射它:
class User < ApplicationRecord self.table_name = "legacy_users" self.primary_key = "user_id" alias_attribute :id, :user_id alias_attribute :name, :usr_name alias_attribute :email, :usr_email end
之后在控制器和视图里,你就可以像操作标准RoR模型一样用@user.name、@user.email来操作数据库里的字段了。
内容的提问来源于stack exchange,提问作者Giovanni Di Clemente
相关产品推荐
相关产品推荐

