如何在 Rails Console 中查找并删除字符串的一部分 - ActiveRecord

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,而且我不知道等效的方法。

有任何想法吗??

提前致谢...

Ant*_*y E 6

您可以使用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如果您想运行验证和回调,可以使用。