我的rails应用程序中有一个客户模型和控制器。在我的客户列表索引页面中,我显示所有具有搜索过滤器选项的客户,以根据他们的购买类型(销售,租赁,试用)显示客户。
@customers = Customer.where(customer_type: ["Sale","Lease","Trail"]).count
如果count > 0
我要将其customer_type
字段更新为大写形式(销售 - >销售,租赁 - >租赁,跟踪 - > TRAIL )对于@customers
集合中的所有客户。
如何以最优化的方式实现它?
答案 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
方法应用于该字符串。