从AR对象数组中删除元素

时间:2017-05-03 12:10:53

标签: ruby-on-rails ruby

有一个下拉菜单,其中包含一系列AR对象 如果购物车中的金额超过3000,则需要显示该元素。

我这样做

element_of_dropmenu.delete_if {|x| x.name == "free delivery" && basket_sum < 3000} # remove one element

对于DeliveryType,购物车中的金额不是真的。这是一个不同的模型

你可以这样做

if sum > 3000
  element_of_dropmenu
else
 element_of_dropmenu.drop(1)
end

我需要在sum>30时显示所有元素,并在sum<30

时删除一个元素

我使用 rails 3.2.6 ruby​​ 2.0.0 :)

我认为做错和丑陋的方法 告诉我如何更好地纠正代码。
感谢。

2 个答案:

答案 0 :(得分:0)

我相信您可以使用简单的SQL或ActiveRecord方法来实现结果。就像下面的片段一样可以解决你的问题。

YourModel.where(["name = ?  AND basket_sum < ? ", "freedelivery", 3000])

或,

YourModel.where("name = ?", "freedelivery").where("basket_sum < ?", 3000)

答案 1 :(得分:0)

您无法从4.1开始在ActiveRecord上调用mutator方法检查release notes

  

关系不再有像#map这样的mutator方法!和#delete_if。在使用这些方法之前,通过调用#to_a转换为数组。

您可以使用select

element_of_dropmenu.select {|x| x.name != "free delivery" && basket_sum > 3000}

或者marmeladze建议您可以使用where子句或更好地创建范围

scope :premium, -> { where("name = ? AND basket_sum > ?", "free delivery", 3000) }

并将其与关联链接

element_of_dropmenu.premium