2014-09-25 64 views
2

处理具有非Rails传统命名的传统系统。请注意,所有表和属性都是大写的,这在sqlserver-adapter中意味着IDid不同。Rails 4,sqlserver-adapter:使用alias_attribute重命名传统属性

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

的最终目标是通过使每个模型制作的Rails的常规方法的遗留系统“行为”有一个ID属性等等...

模型定义:

# 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) =>invalid column name 'id'

= Organization.select(:ID)>invalid column name 'ID'

Organization.select("ID") =>invalid column name 'ID'

是否工作:

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

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

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

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

回答

0

我通过配置数据库适配器(MS SQL Server)将模式视为全部小写解决了这种情况。因此,即使实际的数据库表名可以是“用户”,“人”等,我可以在我的应用程序中将它们称为“用户”,“人”。

请参见: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 
0

我只是用alias_attribute的一天。说实话,我一直在嘲笑它,直到我找到工作。

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

例子:

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

当第一个参数是什么列名,第二个是你走样什么。 我明白,似乎从文档倒退,但是这是我得到这个工作。

+0

我试图切换它们,得到了相同的问题。关于您的特定示例,Rails已经添加了一个“?”到每个属性的末尾并返回一个布尔值。您不需要自己创建查询属性。 – 2014-09-26 12:58:29