我正在尝试为第三方服务创建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
答案 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无法控制模式的数据库。