如何将字符串值附加到ruby中的现有列值?

时间:2015-01-23 10:27:51

标签: ruby-on-rails ruby

我的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'

由于

2 个答案:

答案 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位只是整理字符串,将多个空格转换为单个空格,并删除前导/尾随空格。