如何根据Rails 4中的条件为所有客户更新类型文本列

时间:2016-02-29 05:59:45

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

我的rails应用程序中有一个客户模型和控制器。在我的客户列表索引页面中,我显示所有具有搜索过滤器选项的客户,以根据他们的购买类型(销售,租赁,试用)显示客户。

@customers = Customer.where(customer_type: ["Sale","Lease","Trail"]).count

如果count > 0我要将其customer_type 字段更新为大写形式(销售 - >销售,租赁 - >租赁,跟踪 - > TRAIL )对于@customers集合中的所有客户。

如何以最优化的方式实现它?

3 个答案:

答案 0 :(得分:3)

您可以在循环客户的同时使用ruby的upcase方法。

@customers = Customer.where(customer_type: ["Sale","Lease","Trail"])

@customers.each do |customer|
    customer_type = customer.customer_type.upcase
  customer.update_attribute(:customer_type, customer_type)
end

如果您需要使用此查询更新多个字段,请将customer.update_attribute更改为customer.update_attributes。 多数民众赞成。

答案 1 :(得分:3)

如果有很多记录,那么在循环中初始化Active Record对象效率不高。在这种情况下,您可以使用ActiveRecord/Relation#update_all

Customer
  .where(customer_type: ["Sale","Lease","Trail"])
  .update_all("customer_type = UCASE(customer_type)")

这是针对MySql的。对于Oracle,Postgresql和Sql Server,请使用UPPER(column_name)

答案 2 :(得分:2)

@customers = Customer.where(customer_type: ["Sale","Lease","Trail"])

@customers.each do |customer|
  customer.update_attribute(:customer_type, customer.customer_type.map(&:upcase))
end

在检索具有预期客户类型的客户之后,我们遍历所有客户并将其属性更新为其customer_type数组中所有字符串的大写版本。您不需要检查count > 0是否为@customers,因为如果customer.customer_type.map(&:upcase)集合中没有项目,它就不会循环。

customer_type循环遍历客户foreach (Control item in myform.Controls) { if (item is Label) { var lbl = (Label)item; bool labelIsEmpty = false; try { lbl = (Label)item; labelIsEmpty = (lbl != null && (lbl.Text == string.Empty || lbl.Text == "Label")); } catch { //Throw error message } if (labelIsEmpty) { lbl.Text = "Not Specified"; } } } 数组中的每个字符串,并将upcase方法应用于该字符串。