jak*_*ake 5 activerecord ruby-on-rails rails-console activemodel
我正在 Rails 控制台中寻找一种方法来查找以特定字符串结尾的任何值,并从值中删除该字符串。
大致如下:
Model.all.each{|x| x.duration.slice!(" weeks")}.where("duration IS NOT NULL")
Run Code Online (Sandbox Code Playgroud)
因此,诸如“47 周”之类的值只是变成“47”,但没有 Slice 方法ActiveRecord/ActiveModel,而且我不知道等效的方法。
有任何想法吗??
提前致谢...
您可以使用where("column_name LIKE <matcher>")语法来搜索具有匹配子字符串的列的模型:
matching_models = Model.where("duration LIKE '% weeks'")
Run Code Online (Sandbox Code Playgroud)
然后迭代结果,使用gsub替换列值
matching_models.find_each do |model|
model.update_column(:duration, model.duration.gsub(/ weeks$/, "")
end
Run Code Online (Sandbox Code Playgroud)
一些相关点:
使用find_each而不是each因为它会批量加载数据以更好地使用内存。
gsub用于替换现有字符串。正/ weeks$/则表达式匹配以“weeks”结尾的字符串。
model.update_column用于update_attributes代替绕过ActiveRecord验证和回调。update_attributes如果您想运行验证和回调,可以使用。