Rails 4,sqlserver-adapter:使用alias_attribute重命名遗留属性

时间:2014-09-25 19:45:03

标签: ruby-on-rails-4 database-design legacy-database

处理具有非Rails常规命名的遗留系统。请注意,所有表和属性都是UPPERCASE,在sqlserver-adapter中表示IDid不同。

我原以为alias_attribute :new, :OLD允许您指定可在ActiveRecord/ActiveRelation查询中使用的名称。从我在下面看到的(在rails console中测试),情况并非如此。

最终目标是通过使每个模型具有ID属性等,使遗留系统在Rails传统方法中“行动”......

模型定义:

# app/models/organization.rb
class Organization < ActiveRecord::Base
  self.table_name = "ORGANIZATION"
  self.primary_key = "ORGANIZATION_ID"

  alias_attribute :id, :ORGANIZATION_ID
end

不起作用:

Organization.select(:id) =&gt; invalid column name 'id'

Organization.select(:ID) =&gt; invalid column name 'ID'

Organization.select("ID") =&gt; invalid column name 'ID'

有效吗

Organization.select(:organization_id) =&gt; <finds record>

Organization.select(:ORGANIZATION_ID) =&gt; <finds record>

Organization.select("organization_id") =&gt; <finds record>

Organization.select("ORGANIZATION_ID") =&gt; <finds record>

2 个答案:

答案 0 :(得分:0)

前几天我刚刚使用了alias_attribute。老实说,我一直在盯着它,直到我上班。

通过反转传递给alias_attribute的params,我能够实现您正在寻找的功能。

示例:

alias_attribute :active?, :active
alias_attribute :alert, :message
alias_attribute :delete_at, :expire_at

第一个参数是列名是什么,第二个是你的别名。 我理解这似乎是文档的后退,但这就是我如何使用它。

答案 1 :(得分:0)

我通过配置数据库适配器(MS SQL Server)将模式视为全小写来解决这种情况。因此,即使实际的DB表名称可以是&#34; USERS&#34;,&#34; PEOPLE&#34;等...,我可以将它们引用为&#34;用户&#34;,&# 34;人&#34;在我的申请中。

请参阅:https://github.com/rails-sqlserver/activerecord-sqlserver-adapter#force-schema-to-lowercase

这是我为解决此问题而添加的代码:

# config/initializers/sql_server_adapter.rb
ActiveRecord::ConnectionAdapters::SQLServerAdapter.lowercase_schema_reflection = true