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

zealinux · 2021年03月05日 · 最后由 spike76 回复于 2021年05月08日 · 670 次阅读

数据库表字段名有: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,好久没更新,里边的方法大概可以参考

brookepowell 回复

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

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

def new_attr
  read_attribute(:old_attr)
end

换框架。

palytoxin 回复

@palytoxin 肯定是不行的

pynix 回复

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

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

修改 default_scope + select

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

需要 登录 后方可回复, 如果你还没有账号请 注册新账号