Rails Rails 定制简单的搜索

zengfengbo · 发布于 2017年06月23日 · 最后由 franklinyu 回复于 2017年06月30日 · 563 次阅读
96

Concern

# vi app/models/concerns/searchable.rb

module Searchable
extend ActiveSupport::Concern

  module ClassMethods
    def search(search, attributes: nil)
      attributes = self.new.attributes.keys - ["id", "created_at", "updated_at"] if attributes.nil?
      like_sql = attributes.map { |attr| "#{attr} LIKE ?" }.join("OR ")

      where(like_sql, *(["%#{search}%"]*attributes.size))
    end
  end

end

Model

# vi app/models/post.rb

class Post < ApplicationRecord
  include Searchable
end

Controller

# vi app/controllers/posts_controller.rb

def index
  if params[:search]
    @posts = Post.search(params[:search]).page(params[:page])
  else
    @posts = Post.page params[:page]
  end
end

View

# vi app/views/posts/index.html.erb

<%= form_tag posts_path, :method => 'get' do %>
  <p>
    <%= text_field_tag :search, params[:search] %>
    <%= submit_tag "Search", :name => nil %>
  </p>
<% end %>
共收到 4 条回复
96

这是迷你版的ransack?

2楼 已删除
96
32ad583255925 回复

没用过ransack, 就想对所有Model实现简单的字符串搜索.

2564
32zengfengbo 回复

推荐 ransack

96

if attributes.nil? 可以換成 attributes ||=

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