gpt4 book ai didi

mysql - ActiveRecord,有意将字符串截断为数据库列宽

转载 作者:可可西里 更新时间:2023-11-01 07:52:24 28 4
gpt4 key购买 nike

在 Rails 4 中,ActiveRecord 及其 MySQL 适配器已设置,因此如果您尝试将 AR 模型中的属性保存到 MySQL 数据库,其中属性字符串长度对于 MySQL 列限制来说太宽了——您将引发异常。

太棒了!这比 Rails3 的默认设置要好得多,Rails3 会自动截断字符串。

但是,偶尔我有一个属性,我明确希望将其简单地截断为数据库允许的最大大小,无一异常(exception)。我无法找出使用 AR 执行此操作的最佳/受支持的方法。

  • 理想情况下,它应该在设置属性后立即发生,但我认为它会在保存时发生。 (这不完全是“验证”,因为我从来不想提出,只是截断,但也许验证系统是执行此操作的最佳支持方式?)

  • 理想情况下,它会通过 AR 的数据库自省(introspection)自动计算出数据库列宽,因此如果数据库列宽发生变化(在以后的迁移中),截断限制也会相应地发生变化。但如果那不可能,我将采用硬编码截断限制。

  • 理想情况下,它应该是适用于任何数据库的通用 AR 代码,但如果没有好的方法,我会采用仅适用于 MySQL 的代码

最佳答案

您可以在使用 before_savebefore_validation 插入数据库之前截断数据参见 Active Record Callbacks — Ruby on Rails GuidesActiveRecord::Callbacks

您可以使用 MODEL.columnsMODEL.columns_hash 检索表中的信息。参见 ActiveRecord::ModelSchema::ClassMethods

例如(未测试):

class User < ActiveRecord::Base
before_save :truncate_col
......

def truncate_col
col_size = User.columns_hash['your_column'].limit
self.your_column = self.your_column.truncate(col_size)
end
end

关于mysql - ActiveRecord,有意将字符串截断为数据库列宽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26122948/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com