我在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并忽略它。
感谢您的任何建议!
答案 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。