从Ruby地图中删除值

时间:2015-09-06 12:58:39

标签: ruby-on-rails ruby dictionary

我在Rails控制台中有一个看起来像这样的对象:

  pry(#<User>)> favorite_foods
  => [#<FavoriteFood id: 3, food_id: 1, user_id: 1, removed: false, created_at: "2015-09-06 00:49:35", updated_at: "2015-09-06 00:49:35">,
  #<FavoriteFood id: 4, food_id: 2, user_id: 1, removed: true, created_at: "2015-09-06 12:16:56", updated_at: "2015-09-06 12:17:36">]

favorite_foods与食物处于多态关系。

has_many :favorite_foods
has_many :favorites, through: :favorite_foods, source: :food
has_many :foods, through: :favorite_foods

在favorite_food.rb模型中,我使用此方法设置喜爱的食物:

 def favorited_foods
   favorite_foods.map(&:food_id).to_set
 end

我需要能够移除所有“remove”食物的实例,其中“remove”字段等于true。

例如:从上面的控制台会话中,我希望favorite_foods包含food_id 3,而不是food_id 4.

在favorited_foods方法中执行此操作的干净方法是什么?我尝试合并.reject并忽略它。

感谢您的任何建议!

2 个答案:

答案 0 :(得分:2)

你可以简单地做:

FavoriteFood.where(removed: true).delete_all

将删除FavoriteFood

中的所有removed is true条记录

如果您想使用map进行操作,则可以执行以下操作:

favorited_foods.select { |f| f.removed == true }.map { |f| f.delete }

但不建议这样做,因为它会为每条记录调用一次delete方法。更好的方法是使用delete_all删除它们,如上所示。

答案 1 :(得分:0)

你不能做类似的事情:

def remove_favorited_foods
  favorite_foods.each {|food| Food.destroy(food) if food.removed?}
end

您还应该在模型中添加has_many :foods, dependent: :destroy, through: :favorite_foods,以确保相应的食物被销毁。请参阅this guide