【问题标题】:ruby on rails: how to delete element by column value at model arrayruby on rails:如何在模型数组中按列值删除元素
【发布时间】:2016-02-14 07:12:43
【问题描述】:

模型Cafemeal_available,它有boolean 类型。

搜索咖啡馆时,我想按类别重新搜索复选框:

<form action="/cafe/cafesearch" method="GET">
<label for="chk1"><input type="checkbox" id="chk1" name="meal_available" value=true>meal_available</label>
<input type="submit" value="submit">
</form>

在视图中,通过表单标签传递复选框值,在控制器中,我尝试这样:

coffee = Cafe.all
if params[:meal_available] == true
  @cafe = coffee.delete_if{|x| x.meal_available == false}
end

没有用。如何按数组中的模型列删除元素?

【问题讨论】:

    标签: ruby-on-rails arrays ruby


    【解决方案1】:

    你可以在 Cafe 模型中放入一个 scope 来获取带有 meal_available 的咖啡馆,更多关于 ActiveRecord 范围的信息here

    在咖啡馆模型中:

    class Cafe < ActiveRecord::Base
      scope :meals_available, -> { where(meal_available: true) }
    end
    

    在控制器中:

    @cafes = Cafe.meals_available
    

    就是这样,谢谢。

    【讨论】:

    • 这不是问题的答案。问题是How delete element?
    • @Ilya 如果您再次正确阅读问题和代码,您将得到正确的答案。 Sangwoo Park 正在尝试通过控制器中的记录进行搜索,并且只想获取具有 meal_available: true 和 scopes 的咖啡馆。
    • delete 只是为了拒绝带有 meal_available 的咖啡馆:在这种情况下,false 范围会更好地工作
    • Scope 是一个很好的解决方案,但您没有回答主要问题。作者试图从数据库中删除记录。
    • 这里我必须同意@sghosh968。 OP 要求删除数组中的项目,而不是数据库。在搜索操作(由 GET 请求触发)上重新加载每个页面时操作数据库没有任何意义。 OP 接受上述答案的唯一原因是 b/c 它与要求的结果相同。 +1
    【解决方案2】:

    您只能使用ActiveRecord 方法:

    if params[:meal_available] == true
      @cafe = Cafe.where(meal_available: false)
    end
    

    在这种情况下,coffee = Cafe.all 是多余的。

    coffee = Cafe.all
    if params[:meal_available] == true
      @cafe = coffee.select { |x| x.meal_available == false }
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      • 1970-01-01
      相关资源
      最近更新 更多