Giới thiệu
Mình xin giới thiệu về cách search bằng gem Ransack qua quá trình mà mình đã áp dụng vào project của bản thân và 1 số options được sử dụng
Sử dụng gem trong project
Đầu tiên ta thêm gem Ransack vào Gemfile:
1 2 3 | gem "ransack" |
Sau đó chạy
1 2 3 | bundle install |
Ở đây mình có dữ liệu của 1 model user với các trường name, email, address,…
Sau khi cài đặt xong gem, ta vào model của User thêm scope
1 2 3 4 5 6 | scope :search_user, lambda{|search| search&.squish! if search ransack(user_name_or_email_cont: search).result } |
Tiếp theo ở Controller User ta có phương thức Index và search_params:
1 2 3 4 5 6 7 8 9 10 11 | def index params = search_params ? search_params[:user_name_or_email] : nil @users = User.search_user(params).page(params[:page]).per 5 end def search_params return nil unless params[:user_list] params.require(:user_list).permit :user_name_or_email end |
Ở đây ta search theo user_name và email, trên Index hiển thị 5 bản ghi trên 1 trang.
Tiếp theo ở views/users/index.html.erb ta thêm:
1 2 3 4 5 6 7 8 9 10 11 12 | <%= form_tag users_path, method: :get do |f| %> <%= text_field_tag :user_name_or_email, nil, class: "form__control has-icon list-user__search", name: "user_list[user_name_or_email]", value: value_search(params[:user_list], :user_name_or_email), placeholder: t("search.name_email") %> <%= button_tag :submit, class: "form__search-btn" do %> <span class="icon-search-left"></span> <% end %> <% end %> |
Như vậy ta có thể search user qua user_name và email.
Các option
- eq(equals): Trả về kết quả gồm tất cả bản ghi có giá trị chính xác bằng giá trị đã cho.
- matches: Trả về kết quả gồm các bản ghi có giá trị giống với giá trị đã cho.
- It(less than): Trả về kết quả gồm các bản ghi có giá trị nhỏ hơn giá trị đã cho.
- in: Trả về kết quá gồm các bản ghi có giá trị nằm trong khoảng giá trị đã cho.
- cont: Trả về kết quả gồm các bản ghi có giá trị chứa các giá trị đã cho.
- start: Trả về kết quả gồm các bản ghi có giá trị bắt đầu là các giá trị đã cho.
- end: Trả về kết quả gồm các bản ghi có giá trị kết thúc là các giá trị đã cho.
Và nhiều option khác.
TechTalk via viblo.asia