我的ruby模型中有一个方法如下:
def testing
update_stock = Stock::Detail.find(stock) # (Assume I have a stock id.)
update_stock.update_attributes(details: "dashboard")
end
以上工作正常。但是,如果details
的值已经像'table,chair'
那样string
。如何将'dashboard'
附加到details
字段。目前update_attributes
删除旧值并更新新值。我想将值附加到现有值。
如果我将字符串值声明为变量,如
detail_value = 'Code: 123AB, dashboard, code: 1235Q, table, chair'
def testing
update_stock = Stock::Detail.find(stock) # (Assume I have a stock id.)
update_stock.update_attributes(details: detail_value)
end
我想在details
列附加上述code
已存在的位置。
例如,我的详细信息列的值类似于
'Code: 123AB, dashboard, code: 1235Q, table, chair' # Before
我的参数是'Code:123AB, dashboard' # Parameter
我想从parameter
值中删除string
并更新到数据库列。
因此我的column
值为'code: 1235Q, table, chair'
由于
答案 0 :(得分:4)
为什么不喜欢这样:
def testing
update_stock = Stock::Detail.find(stock)
update_stock.details += 'dashboard'
update_stock.save
end
更新答案:也许检查details
中是否出现此字符串:
update_stock.details += 'dashboard' unless update_stock.details =~ /dashboard/
答案 1 :(得分:1)
作为Marek答案的替代方案,您可以添加一个“setter”方法,该方法会附加字符串而不是替换它。然后你可以在控制器中执行标准的update_attributes:我个人认为尽可能保持控制器操作的标准化是件好事。例如
# in Stock::Detail
#setter method
def append_details=(s)
self.details ||= ""
unless self.details.include?(s)
self.details << " #{s}"
end
end
#getter version of above - just shows the value of details
def append_details
self.details || ""
end
现在在您看来,您可以说,例如
<%= form_for @detail do |f| %>
<label>Details <%= f.input :append_details %>
...
现在您可以在创建控制器中执行标准行为,例如
@detail.update_attributes(params[:detail])
几个笔记:
1)就我个人而言,我认为你在使用一个名为Detail的模型时遇到麻烦,该模型有一个方法.details - 这很令人困惑。
2)看一下serialize
- 将它保存为字符串数组而不是字符串可能更好。 http://api.rubyonrails.org/classes/ActiveModel/Serialization.html
EDIT - 从字段中删除子字符串的类似方法。
# in Stock::Detail
#setter method
def subtract_details=(s)
self.details ||= ""
self.details = self.details.gsub(s,"").gsub(/\s+/, " ").strip
end
#getter version of above - just shows the value of details
def subtract_details
self.details || ""
end
.gsub(/\s+/, " ").strip
位只是整理字符串,将多个空格转换为单个空格,并删除前导/尾随空格。