如何创建由数据库表支持的Rails 3模型,而不具有ActiveRecord动态生成的属性?

时间:2013-11-26 21:57:26

标签: mysql ruby-on-rails ruby ruby-on-rails-3 activerecord

我正在尝试为第三方服务创建API,并且我已经获得了访问具有我需要的所有数据的复制数据库。不幸的是,在MySQL中使用哪些特权以便不暴露专有数据库设计存在限制。

数据库设置为将某些数据库表公开为视图,并在这些视图上授予SELECT权限。

我有一些模型支持的模型不符合典型的Rails表命名约定,定义如下:

class MyAPIModule::City < ActiveRecord::Base
    set_table_name "VIEW_CITY"
end

ActiveModel尝试动态构建模型属性的任何查询都会失败,例如:

MyAPIModule::City.find(1)

失败:

Mysql2::Error: SHOW VIEW command denied to user 'theuser'@'thehost' for table 'VIEW_CITY': SHOW CREATE TABLE `VIEW_CITY`
ActiveRecord::StatementInvalid: Mysql2::Error: SHOW VIEW command denied to user 'theuser'@'thehost' for table 'VIEW_CITY': SHOW CREATE TABLE `VIEW_CITY`

问题是,priveleges不允许ActiveRecord运行“SHOW CREATE TABLE”查询来收集列信息并构建模型属性。

有没有办法对表模式进行硬编码,以防止ActiveRecord需要使用“SHOW CREATE TABLE”查询数据库中的表构造?

修改

结合我对sameera207的回复:

class MyAPIModule::City
    include ActiveModel::Validations
    include ActiveModel::Conversion
    include ActiveModel::SerializerSupport
    extend  ActiveModel::Naming

    ...
end

3 个答案:

答案 0 :(得分:1)

我不确定是否有办法从数据库中跳过列限制,但是一个解决方法就是直接执行你的sql命令。

需要手动编码,

class MyAPIModule::City < ActiveRecord::Base
    set_table_name "VIEW_CITY"

    def find(id)
       obj = ActiveRecord::Base.connection().execute("select * from your table")
       #above will return an array, so you will have to create your object
       obj
    end 

end

答案 1 :(得分:0)

您可以尝试手动定义选择范围:

default_scope select("column1, column2, column3")

答案 2 :(得分:0)

我将回答我自己的问题,因为我发现了一个非常好的解决方案,可以让你完成我想要完成的所有事情,并提供类似ActiveRecord所做的查询方法......

DataMapper是一个支持显式数据库字段映射的gem,用于遗留数据库或Rails无法控制模式的数据库。