Gem ransack 和 scope 搭配使用方法求教

zouchaoge · 2015年04月28日 · 最后由 zouchaoge 回复于 2015年05月04日 · 3791 次阅读

gem 在 github 地址:https://github.com/activerecord-hackery/ransack

Gemfile 中使用版本:

gem 'ransack', '1.6.6'

model 内容:

class Order < ActiveRecord::Base
  scope :express_status, ->(status) do
    case status
    when 0
      where('code = ?', '')
    when 1
      where('code <> ?', '')
    else
      nil
    end
  end

  private

  def self.ransackable_scopes(auth_object = nil)
    %i(express_status)
  end
end

controller 内容:

def index
  @search = Order.ransack(params[:q])
  @orders = @search.result.order('id desc').paginate(page: params[:page], per_page: 20)
end

view 内容:

<%= search_form_for @search, method: :get, class: 'form-inline'  do |f|  %>
<label>投递状态:</label>
<%= f.select :express_status,
  { '未投递' => 0, '已投递' =>  1 },
  class: 'form-control' -%>
</div>
<%= f.submit '搜索', class: 'btn btn-primary' %>
<% end %>

用来筛选订单是否已经投递的状态,库中存储的是 code 字符串; 现在的情况是我在 console 中执行Order.ransack({ :express_status => '0' })可以得到如下结果:

Ransack::Search<class: Order, scope: {"express_status"=>"0"}, base: Grouping <combinator: and>>

但是执行Order.ransack({ :express_status => '0' }).result.to_sql得到的 却怎么都:

SELECT `orders`.* FROM `orders`

求助 ransack 到底怎么利用 scope 搜索查询呢?

@zouchaoge try Order.ransack({ :express_status => 0 }) ?

#1 楼 @larrylv 试过还是不行,我在 case status.to_i 也是没有效果的

你为什么要这么用?

class Order < ActiveRecord::Base
end

def index
  @search = Order.ransack(params[:q])
  @orders = @search.result.order('id desc').paginate(page: params[:page], per_page: 20)
end
<%= search_form_for @search, method: :get, class: 'form-inline'  do |f|  %>
  <label>投递状态:</label>
  <%= f.select :status_eq,{ '未投递' => 0, '已投递' =>  1 },class: 'form-control' %>
  <%= f.submit '搜索', class: 'btn btn-primary' %>
<% end %>

这样不就行了 用 gem 先读文档 不要自己发明创造

#3 楼 @zhang_soledad 你大概没有看懂我说的东西,你在 view 层给的字段是 status_eq,我数据库没有写这个字段呢。

我正是因为看了https://github.com/activerecord-hackery/ransack#using-scopesclass-methods 这个 gem 包的 README.md 文档才使用的,但是没有成功

#3 楼 @zhang_soledad 我要使用的是 code 字段,code 字段要么有值,要么就是空字符串!所以我写了那个 scope

@zouchaoge

<%= f.select :code_present , { '未投递' => false, '已投递' =>  true },class: 'form-control' %>

#7 楼 @zhang_soledad 非常感谢你的解答,照你说的搞定了!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号