Rails 数据库列名与 Rails 方法名冲突怎么解决?

zealinux · March 05, 2021 · Last by spike76 replied at May 08, 2021 · 657 hits

数据库表字段名有:attribute,save,或者 type 等其他保留名(Rails/Ruby 里的方法名),

最简单的ActiveModel.first 就会出错,提示:

ActiveRecord::DangerousAttributeError

现在数据库不能变动,Rails 里该怎么解决?

试试 alias_attribute

class Person
    alias_attribute :nickname, :name
end

via: https://api.rubyonrails.org/classes/ActiveModel/AttributeMethods/ClassMethods.html

https://github.com/bjones/safe_attributes

可以看下这个 gem,好久没更新,里边的方法大概可以参考

还是会出错,只是给了别名,但是原有 name 还是保留的,所以会出错

activeModel.attributes["first"],不知道行不行

def new_attr
  read_attribute(:old_attr)
end

换框架。

建一个视图

Reply to palytoxin

@palytoxin 肯定是不行的

Reply to pynix

换框架肯定是行的,比如 Sequel,但还是舍不得 Rails 好用。

我是用 select 解决这个问题,复杂就用视图了。

修改 default_scope + select

我在 rails6 对接第三方数据库也遇到了这个问题,使用 select as 依然会报错。因为不关心冲突字段的值,所以最终用了个折衷方案,忽略冲突的字段 self.ignored_columns = [:conflict_columns]

You need to Sign in before reply, if you don't have an account, please Sign up first.