การค้นหาแบบจำลองที่สนับสนุนใน Rails ตัวอย่างหวือบาง:
## app/searches/post_search.rb
class PostSearch < TalentScout :: ModelSearch
criteria :title_includes do | string |
where ( "title LIKE ?" , "% #{ string } %" )
end
criteria :within , choices : {
"Last 24 hours" => 24 . hours ,
"Past Week" => 1 . week ,
"Past Month" => 1 . month ,
"Past Year" => 1 . year ,
} do | duration |
where ( "created_at >= ?" , duration . ago )
end
criteria :only_published , :boolean , default : true do | only |
where ( "published" ) if only
end
order :created_at , default : :desc
order :title
end
## app/controllers/posts_controller.rb
class PostsController < ApplicationController
def index
@search = model_search
@posts = @search . results
end
end
<!-- app/views/posts/index.html.erb -->
<%= form_with model : @search , local : true , method : :get do | form | %>
<%= form . label :title_includes %>
<%= form . text_field :title_includes %>
<%= form . label :within %>
<%= form . select :within , @search . each_choice ( :within ) , include_blank : true %>
<%= form . label :only_published %>
<%= form . check_box :only_published %>
<%= form . submit %>
<% end %>
< table >
< thead >
< tr >
< th >
<%= link_to_search "Title" , @search . toggle_order ( :title ) %>
<%= img_tag " #{ @search . order_directions [ :title ] || "unsorted" } _icon.png" %>
</ th >
< th >
<%= link_to_search "Time" , @search . toggle_order ( :created_at ) %>
<%= img_tag " #{ @search . order_directions [ :created_at ] || "unsorted" } _icon.png" %>
</ th >
</ tr >
</ thead >
< tbody >
<% @posts . each do | post | %>
< tr >
< td > <%= link_to post . title , post %> </ td >
< td > <%= post . created_at %> </ td >
</ tr >
<% end %>
</ tbody >
</ table >
ในตัวอย่างข้างต้น:
PostSearch
รับผิดชอบในการค้นหาโมเดล Post
สามารถใช้เกณฑ์ที่กำหนดไว้ผสมกัน โดยไม่สนใจค่าอินพุตที่หายไป ว่างเปล่า หรือไม่ถูกต้องโดยอัตโนมัติ นอกจากนี้ยังสามารถเรียงลำดับผลลัพธ์ตามคำสั่งใดคำสั่งหนึ่งที่กำหนดไว้ ในทิศทางจากน้อยไปมากหรือจากมากไปน้อยPostsController#index
ใช้ตัวช่วย model_search
เพื่อสร้างอินสแตนซ์ PostSearch
และกำหนดให้กับตัวแปร @search
เพื่อใช้ในภายหลังในมุมมอง ผลลัพธ์การค้นหายังถูกกำหนดให้กับตัวแปรเพื่อใช้ในมุมมองอีกด้วย@search
ตัวช่วย link_to_search
ใช้เพื่อสร้างลิงก์ในส่วนหัวของตารางเพื่อจัดเรียงผลลัพธ์ โปรดทราบว่าเมธอด toggle_order
ที่ใช้ที่นี่จะส่งคืนออบเจ็กต์การค้นหาใหม่ โดยปล่อยให้ @search
ไม่มีการแก้ไขสำหรับคำอธิบายโดยละเอียดเกี่ยวกับวิธีการที่ใช้ในตัวอย่างนี้ โปรดดูเอกสารประกอบ API
คุณสามารถใช้ talent_scout:search
เพื่อสร้างคำจำกัดความคลาสการค้นหาโมเดล ตัวอย่างเช่น,
$ rails generate talent_scout:search post
จะสร้างไฟล์ "app/searches/post_search.rb" ที่มี:
class PostSearch < TalentScout :: ModelSearch
end
คลาสการค้นหาสืบทอดมาจาก TalentScout::ModelSearch
คลาสโมเดลเป้าหมายอนุมานได้จากชื่อคลาสการค้นหา ตัวอย่างเช่น PostSearch
จะค้นหาโมเดล Post
ตามค่าเริ่มต้น หากต้องการแทนที่การอนุมานนี้ ให้ใช้ ModelSearch::model_class=
:
class EmployeeSearch < TalentScout :: ModelSearch
self . model_class = Person # search for Person models instead of `Employee`
end
เกณฑ์การค้นหาถูกกำหนดด้วยเมธอด ModelSearch::criteria
คำจำกัดความของเกณฑ์สามารถระบุได้ด้วยวิธีใดวิธีหนึ่งจากสามวิธี: ด้วยคำสั่งย่อยโดยนัย พร้อมบล็อกการสืบค้นที่ชัดเจน หรือด้วยการอ้างอิงขอบเขตโมเดล เพื่อแสดงให้เห็น เกณฑ์ :title
สามรายการต่อไปนี้เทียบเท่ากันทั้งหมด:
class Post < ActiveRecord :: Base
scope :title_equals , -> ( string ) { where ( title : string ) }
end
class PostSearch < TalentScout :: ModelSearch
criteria :title
criteria :title do | string |
where ( title : string )
end
criteria :title , & :title_equals
end
โปรดทราบว่าบล็อกการสืบค้นที่ชัดเจนจะได้รับการประเมินในบริบทของ ActiveRecord::Relation
ของโมเดล เช่นเดียวกับการบล็อก scope
Active Record
คำจำกัดความของเกณฑ์สามารถระบุชนิดข้อมูล ซึ่งจะทำให้ค่าอินพุตถูกพิมพ์ก่อนที่จะถูกส่งไปยังบล็อกหรือขอบเขตการสืบค้น เป็นตัวอย่าง:
class PostSearch < TalentScout :: ModelSearch
criteria :created_on , :date do | date |
where ( created_at : date . beginning_of_day .. date . end_of_day )
end
end
PostSearch . new ( created_on : "Dec 31, 1999" )
ที่นี่ สตริง "Dec 31, 1999"
ที่ส่งผ่านไปยังตัวสร้าง PostSearch
จะถูกพิมพ์เป็น Date
ก่อนที่จะถูกส่งไปยังบล็อกแบบสอบถาม
ประเภทเกณฑ์เริ่มต้นคือ :string
ซึ่งหมายความว่าตามค่าเริ่มต้น ค่าอินพุตทั้งหมดจะถูกแปลงเป็นสตริง ค่าเริ่มต้นนี้ (ตรงข้ามกับค่าเริ่มต้นของการไม่พิมพ์ดีด) ช่วยให้มั่นใจถึงพฤติกรรมที่สอดคล้องกันไม่ว่าออบเจ็กต์การค้นหาจะถูกสร้างขึ้นอย่างไร ไม่ว่าจะจากค่าที่พิมพ์อย่างเข้มงวดหรือจากพารามิเตอร์คำขอแบบฟอร์มการค้นหา
ประเภทเกณฑ์ที่ใช้ได้จะเหมือนกับแอตทริบิวต์ Active Model: :big_integer
, :boolean
, :date
, :datetime
, :decimal
, :float
, :integer
, :string
, :time
รวมถึงประเภทที่กำหนดเองใดๆ ที่คุณกำหนด
นอกจากนี้ยังมีประเภทความสะดวกเพิ่มเติม: :void
ประเภท :void
typecasts เช่น :boolean
แต่ป้องกันไม่ให้มีการใช้เกณฑ์เมื่อค่า typecasted เป็นเท็จ ตัวอย่างเช่น:
class PostSearch < TalentScout :: ModelSearch
criteria :only_edited , :void do
where ( "modified_at > created_at" )
end
end
# The following will apply `only_edited`:
PostSearch . new ( only_edited : true )
PostSearch . new ( only_edited : "1" )
# The following will skip `only_edited`:
PostSearch . new ( only_edited : false )
PostSearch . new ( only_edited : "0" )
PostSearch . new ( only_edited : "" )
แทนที่จะระบุประเภท คำนิยามเกณฑ์อาจระบุตัวเลือก ตัวเลือกจะกำหนดชุดของค่าที่สามารถส่งผ่านไปยังบล็อกแบบสอบถามได้
ตัวเลือกสามารถระบุเป็นอาร์เรย์ของค่าที่เป็นมิตรต่อมนุษย์ได้:
class PostSearch < TalentScout :: ModelSearch
criteria :category , choices : %w[ Science Tech Engineering Math ] do | name |
where ( category : name . downcase )
end
end
...หรือเป็นแฮชที่มีคีย์ที่เป็นมิตรต่อมนุษย์:
class PostSearch < TalentScout :: ModelSearch
criteria :within , choices : {
"Last 24 hours" => 24 . hours ,
"Past Week" => 1 . week ,
"Past Month" => 1 . month ,
"Past Year" => 1 . year ,
} do | duration |
where ( "created_at >= ?" , duration . ago )
end
end
ค่าที่ส่งไปยังบล็อกแบบสอบถามจะเป็นค่าใดค่าหนึ่งใน Array หรือค่าใดค่าหนึ่งใน Hash ออบเจ็กต์การค้นหาอาจถูกสร้างขึ้นด้วยค่าอาร์เรย์หรือคีย์แฮชหรือค่าแฮช:
PostSearch . new ( category : "Math" )
PostSearch . new ( within : "Last 24 hours" )
PostSearch . new ( within : 24 . hours )
แต่หากมีการระบุตัวเลือกที่ไม่ถูกต้อง เกณฑ์ที่เกี่ยวข้องจะไม่ถูกนำมาใช้:
# The following will skip the criteria, but will not raise an error:
PostSearch . new ( category : "Marketing" )
PostSearch . new ( within : 12 . hours )
คำจำกัดความของเกณฑ์สามารถระบุค่าเริ่มต้น ซึ่งจะถูกส่งไปยังบล็อกแบบสอบถามเมื่อค่าอินพุตหายไป ค่าเริ่มต้นจะปรากฏในแบบฟอร์มการค้นหาด้วย
class PostSearch < TalentScout :: ModelSearch
criteria :within_days , :integer , default : 7 do | num |
where ( "created_at >= ?" , num . days . ago )
end
end
# The following are equivalent:
PostSearch . new ( )
PostSearch . new ( within_days : 7 )
เกณฑ์จะไม่ถูกนำมาใช้หากข้อใดข้อหนึ่งต่อไปนี้เป็นจริง:
ค่าอินพุตเกณฑ์หายไป และไม่ได้ระบุค่าเริ่มต้น
ออบเจ็กต์การค้นหาถูกสร้างขึ้นด้วย ActionController::Parameters
(แทนที่จะเป็นแฮช) และค่าอินพุตเกณฑ์ blank?
และไม่ได้ระบุค่าเริ่มต้นไว้ (ลักษณะการทำงานนี้ป้องกันไม่ให้เขตข้อมูลแบบฟอร์มการค้นหาที่ว่างเปล่าส่งผลกระทบต่อผลลัพธ์การค้นหา)
typecast ของค่าอินพุตเกณฑ์ล้มเหลว ตัวอย่างเช่น:
class PostSearch < TalentScout :: ModelSearch
criteria :created_on , :date do | date |
where ( created_at : date . beginning_of_day .. date . end_of_day )
end
end
# The following will skip `created_on`, but will not raise an error:
PostSearch . new ( created_on : "BAD" )
คำจำกัดความของเกณฑ์ระบุประเภท :void
และค่าอินพุต typecasted เป็นเท็จ
คำนิยามเกณฑ์ระบุตัวเลือก และค่าที่ป้อนเข้าไม่ใช่ตัวเลือกที่ถูกต้อง
บล็อกแบบสอบถามเกณฑ์ส่งคืน nil
ตัวอย่างเช่น:
class PostSearch < TalentScout :: ModelSearch
criteria :minimum_upvotes , :integer do | minimum |
where ( "upvotes >= ?" , minimum ) unless minimum <= 0
end
end
# The following will skip the `minimum_upvotes` where clause:
PostSearch . new ( minimum_upvotes : 0 )
ลำดับผลการค้นหาถูกกำหนดด้วยเมธอด ModelSearch::order
:
class PostSearch < TalentScout :: ModelSearch
order :created_at
order :title
order :category
end
PostSearch . new ( order : :created_at )
PostSearch . new ( order : :title )
PostSearch . new ( order : :category )
สามารถใช้คำสั่งซื้อได้ครั้งละ 1 รายการเท่านั้น แต่คำสั่งซื้อสามารถประกอบด้วยหลายคอลัมน์ได้:
class PostSearch < TalentScout :: ModelSearch
order :category , [ :category , :title ]
end
# The following will order by "category, title":
PostSearch . new ( order : :category )
การออกแบบที่จำกัดนี้ถูกเลือกเนื่องจากอนุญาตให้มีการจัดเรียงแบบหลายคอลัมน์ที่มี UI การเรียงลำดับคอลัมน์เดียวที่เรียบง่ายกว่า และเนื่องจากจะป้องกันการเรียงลำดับหลายคอลัมน์เฉพาะกิจที่อาจไม่ได้รับการสนับสนุนจากดัชนีฐานข้อมูล
สามารถใช้คำสั่งในทิศทางขึ้นหรือลงได้ เมธอด ModelSearch#toggle_order
จะใช้ลำดับจากน้อยไปหามาก หรือจะเปลี่ยนทิศทางของลำดับที่ใช้จากน้อยไปมากเป็นมากไปหาน้อย:
class PostSearch < TalentScout :: ModelSearch
order :created_at
order :title
end
# The following will order by "title":
PostSearch . new ( ) . toggle_order ( :title )
PostSearch . new ( order : :created_at ) . toggle_order ( :title )
# The following will order by "title DESC":
PostSearch . new ( order : :title ) . toggle_order ( :title )
โปรดทราบว่าเมธอด toggle_order
ไม่ได้แก้ไขออบเจ็กต์การค้นหาที่มีอยู่ แต่จะสร้างออบเจ็กต์การค้นหาใหม่โดยมีลำดับใหม่และค่าเกณฑ์ของออบเจ็กต์การค้นหาก่อนหน้าแทน
เมื่อมีการใช้ลำดับหลายคอลัมน์ในทิศทางจากมากไปน้อย คอลัมน์ทั้งหมดจะได้รับผลกระทบ:
class PostSearch < TalentScout :: ModelSearch
order :category , [ :category , :title ]
end
# The following will order by "category DESC, title DESC":
PostSearch . new ( order : :category ) . toggle_order ( :category )
หากต้องการหลีกเลี่ยงพฤติกรรมนี้และแก้ไขคอลัมน์ในทิศทางคงที่ ให้เพิ่ม " ASC"
หรือ " DESC"
ต่อท้ายชื่อคอลัมน์:
class PostSearch < TalentScout :: ModelSearch
order :category , [ :category , "created_at ASC" ]
end
# The following will order by "category, created_at ASC":
PostSearch . new ( order : :category )
# The following will order by "category DESC, created_at ASC":
PostSearch . new ( order : :category ) . toggle_order ( :category )
สามารถใช้คำสั่งซื้อในทิศทางขึ้นหรือลงได้โดยตรง โดยไม่ต้องใช้ toggle_order
โดยการต่อท้ายส่วนต่อท้ายที่เหมาะสม:
class PostSearch < TalentScout :: ModelSearch
order :title
end
# The following will order by "title":
PostSearch . new ( order : :title )
PostSearch . new ( order : "title.asc" )
# The following will order by "title DESC":
PostSearch . new ( order : "title.desc" )
ส่วนต่อท้ายเริ่มต้นดังที่เห็นในตัวอย่างข้างต้นคือ ".asc"
และ ".desc"
สิ่งเหล่านี้ถูกเลือกเนื่องจากเป็นมิตรกับ I18n สามารถแทนที่ได้โดยเป็นส่วนหนึ่งของคำจำกัดความของคำสั่งซื้อ:
class PostSearch < TalentScout :: ModelSearch
order "Title" , [ :title ] , asc_suffix : " (A-Z)" , desc_suffix : " (Z-A)"
end
# The following will order by "title":
PostSearch . new ( order : "Title" )
PostSearch . new ( order : "Title (A-Z)" )
# The following will order by "title DESC":
PostSearch . new ( order : "Title (Z-A)" )
คำสั่งซื้อสามารถถูกกำหนดให้เป็นคำสั่งซื้อเริ่มต้นได้ ซึ่งจะทำให้คำสั่งซื้อนั้นถูกนำไปใช้เมื่อไม่มีการระบุคำสั่งซื้อเป็นอย่างอื่น:
class PostSearch < TalentScout :: ModelSearch
order :created_at , default : :desc
order :title
end
# The following will order by "created_at DESC":
PostSearch . new ( )
# The following will order by "created_at":
PostSearch . new ( order : :created_at )
# The following will order by "title":
PostSearch . new ( order : :title )
โปรดทราบว่าทิศทางการสั่งซื้อเริ่มต้นสามารถเป็นได้ทั้งขึ้นหรือลงโดยการระบุ default: :asc
หรือ default: :desc
ตามลำดับ นอกจากนี้ เช่นเดียวกับที่สามารถใช้คำสั่งซื้อได้ครั้งละหนึ่งคำสั่งซื้อเท่านั้น คำสั่งซื้อเดียวเท่านั้นที่สามารถกำหนดเป็นค่าเริ่มต้นได้
ขอบเขตการค้นหาเริ่มต้นสามารถกำหนดได้ด้วย ModelSearch::default_scope
:
class PostSearch < TalentScout :: ModelSearch
default_scope { where ( published : true ) }
end
ขอบเขตเริ่มต้นจะถูกนำไปใช้โดยไม่คำนึงถึงเกณฑ์หรือค่าอินพุตของคำสั่งซื้อ
ตัวควบคุมสามารถใช้เมธอดตัวช่วย model_search
เพื่อสร้างออบเจ็กต์การค้นหาด้วยพารามิเตอร์การสืบค้นของคำขอปัจจุบัน:
class PostsController < ApplicationController
def index
@search = model_search
@posts = @search . results
end
end
ในตัวอย่างข้างต้น model_search
สร้างออบเจ็กต์ PostSearch
คลาสการค้นหาโมเดลได้รับมาจากชื่อคลาสคอนโทรลเลอร์โดยอัตโนมัติ หากต้องการแทนที่คลาสการค้นหาโมเดล ให้ใช้ ::model_search_class=
:
class EmployeesController < ApplicationController
self . model_search_class = PersonSearch
def index
@search = model_search # will construct PersonSearch instead of `EmployeeSearch`
@employees = @search . results
end
end
ในตัวอย่างเหล่านี้ ออบเจ็กต์การค้นหาจะถูกจัดเก็บไว้ใน @search
เพื่อใช้ในมุมมอง โปรดทราบว่า @search.results
ส่งคืน ActiveRecord::Relation
ดังนั้นการกำหนดขอบเขตเพิ่มเติมใดๆ เช่น การแบ่งหน้า สามารถนำมาใช้ได้
แบบฟอร์มการค้นหาสามารถแสดงผลโดยใช้ตัวสร้างแบบฟอร์มของ Rails และวัตถุการค้นหา:
<%= form_with model: @search, local: true, method: :get do |form| %>
<%= form.label :title_includes %>
<%= form.text_field :title_includes %>
<%= form.label :created_on %>
<%= form.date_field :created_on %>
<%= form.label :only_published %>
<%= form.check_box :only_published %>
<%= form.submit %>
<% end %>
สังเกต method: :get
อาร์กิวเมนต์ไปที่ form_with
สิ่งนี้จำเป็น
ช่องแบบฟอร์มจะถูกเติมด้วยค่าอินพุตเกณฑ์ (หรือค่าเริ่มต้น) ที่มีชื่อเดียวกันจาก @search
สามารถใช้ช่องแบบฟอร์มที่เหมาะสมกับประเภทได้ เช่น date_field
สำหรับประเภท :date
, check_box
สำหรับประเภท :boolean
และ :void
เป็นต้น
ตามค่าเริ่มต้น แบบฟอร์มจะส่งไปยังการดำเนินการดัชนีของคอนโทรลเลอร์ที่สอดคล้องกับ model_class
ของออบเจ็กต์การค้นหา ตัวอย่างเช่น PostSearch.model_class
คือ Post
ดังนั้นแบบฟอร์มที่มีอินสแตนซ์ของ PostSearch
จะส่งไปที่ PostsController#index
หากต้องการเปลี่ยนตำแหน่งที่จะส่งแบบฟอร์ม ให้ใช้ตัวเลือก :url
ของ form_with
ลิงก์การค้นหาสามารถแสดงผลได้โดยใช้เมธอดตัวช่วยดู link_to_search
:
<%= link_to_search "Sort by title", @search.toggle_order(:title, :asc) %>
ลิงก์จะชี้ไปที่ตัวควบคุมปัจจุบันและการดำเนินการปัจจุบันโดยอัตโนมัติ พร้อมด้วยพารามิเตอร์การค้นหาจากออบเจ็กต์การค้นหาที่กำหนด หากต้องการลิงก์ไปยังคอนโทรลเลอร์หรือการดำเนินการอื่น ให้ส่งตัวเลือก Hash แทนที่ออบเจ็กต์การค้นหา:
<%= link_to_search "Sort by title", { controller: "posts", action: "index",
search: @search.toggle_order(:title, :asc) } %>
ตัวช่วย link_to_search
ยังยอมรับตัวเลือก HTML แบบเดียวกับที่ตัวช่วย link_to
ของ Rails ทำ:
<%= link_to_search "Sort by title", @search.toggle_order(:title, :asc),
id: "title-sort-link", class: "sort-link" %>
...เช่นเดียวกับบล็อกเนื้อหา:
<%= link_to_search @search.toggle_order(:title, :asc) do %>
Sort by title <%= img_tag "sort_icon.png" %>
<% end %>
ModelSearch
คลาส ModelSearch
มีหลายวิธีที่เป็นประโยชน์เมื่อเรนเดอร์มุมมอง
วิธีหนึ่งดังกล่าวคือ ModelSearch#toggle_order
ซึ่งแสดงในตัวอย่างก่อนหน้านี้ โปรดจำไว้ว่า toggle_order
เป็นวิธีการแบบตัวสร้างที่ไม่ได้แก้ไขออบเจ็กต์การค้นหา แต่จะทำซ้ำออบเจ็กต์การค้นหาและกำหนดลำดับของออบเจ็กต์ใหม่ ลักษณะการทำงานดังกล่าวเหมาะสำหรับการสร้างลิงก์ไปยังการค้นหาหลายรูปแบบ เช่น ลิงก์การเรียงลำดับในส่วนหัวของคอลัมน์ของตาราง
ModelSearch#with
และ ModelSearch#without
วิธีการสไตล์ตัวสร้างเพิ่มเติมอีกสองวิธีคือ ModelSearch#with
และ ModelSearch#without
เช่นเดียวกับ toggle_order
ทั้งสองวิธีนี้จะส่งคืนออบเจ็กต์การค้นหาใหม่ โดยปล่อยให้ออบเจ็กต์การค้นหาเดิมไม่มีการแก้ไข with
วิธีการยอมรับค่าอินพุตของเกณฑ์เพื่อรวมเข้ากับค่าอินพุตของเกณฑ์ชุดดั้งเดิม:
class PostSearch < TalentScout :: ModelSearch
criteria :title
criteria :published , :boolean
end
# The following are equivalent:
PostSearch . new ( title : "Maaaaath!" , published : true )
PostSearch . new ( title : "Maaaaath!" ) . with ( published : true )
PostSearch . new ( title : "Math?" ) . with ( title : "Maaaaath!" , published : true )
วิธีการ without
ยอมรับรายการค่าอินพุตเกณฑ์ที่จะยกเว้น (ยังคงใช้ค่าเกณฑ์เริ่มต้น):
class PostSearch < TalentScout :: ModelSearch
criteria :title
criteria :published , :boolean , default : true
end
# The following are equivalent:
PostSearch . new ( title : "Maaaaath!" )
PostSearch . new ( title : "Maaaaath!" , published : false ) . without ( :published )
ModelSearch#each_choice
อีกวิธีที่เป็นประโยชน์คือ ModelSearch#each_choice
ซึ่งจะวนซ้ำตัวเลือกที่กำหนดไว้สำหรับเกณฑ์ที่กำหนด สามารถใช้เพื่อสร้างลิงก์ไปยังรูปแบบต่างๆ ของการค้นหา:
class PostSearch < TalentScout :: ModelSearch
criteria :category , choices : %w[ Science Tech Engineering Math ]
end
<% @search.each_choice(:category) do |choice, chosen| %>
<%= link_to_search "Category: #{choice}", @search.with(category: choice),
class: ("active" if chosen) %>
<% end %>
โปรดสังเกตว่าหากบล็อกที่ส่งผ่านไปยัง each_choice
ยอมรับสองอาร์กิวเมนต์ อาร์กิวเมนต์ที่ 2 จะระบุว่าตัวเลือกนั้นถูกเลือกอยู่หรือไม่
หากไม่มีการส่งผ่านไปยัง each_choice
ก็จะส่งกลับ Enumerator
สามารถใช้เพื่อสร้างตัวเลือกสำหรับกล่องเลือก:
<%= form_with model: @search, local: true, method: :get do |form| %>
<%= form.select :category, @search.each_choice(:category) %>
<%= form.submit %>
<% end %>
คุณสามารถเรียกใช้เมธอด each_choice
ด้วย :order
การทำเช่นนี้จะวนซ้ำแต่ละทิศทางของแต่ละลำดับที่กำหนดไว้ โดยให้ป้ายกำกับที่เหมาะสมรวมถึงคำต่อท้ายทิศทาง:
class PostSearch < TalentScout :: ModelSearch
order "Title" , [ :title ] , asc_suffix : " (A-Z)" , desc_suffix : " (Z-A)"
order "Time" , [ :created_at ] , asc_suffix : " (oldest first)" , desc_suffix : " (newest first)"
end
<%= form_with model: @search, local: true, method: :get do |form| %>
<%= form.select :order, @search.each_choice(:order) %>
<%= form.submit %>
<% end %>
กล่องเลือกในแบบฟอร์มด้านบนจะแสดงตัวเลือกสี่ตัวเลือก: "ชื่อ (AZ)", "ชื่อ (ZA)", "เวลา (เก่าที่สุดก่อน)", "เวลา (ใหม่ที่สุดก่อน)"
ModelSearch#order_directions
สุดท้ายนี้ เมธอดตัวช่วย ModelSearch#order_directions
จะส่งคืน HashWithIndifferentAccess
ซึ่งสะท้อนถึงทิศทางที่ใช้ในปัจจุบันของแต่ละคำสั่งซื้อที่กำหนดไว้ ประกอบด้วยคีย์สำหรับแต่ละลำดับที่กำหนดไว้ และเชื่อมโยงแต่ละคีย์ด้วย :asc
, :desc
หรือ nil
class PostSearch < TalentScout :: ModelSearch
order "Title" , [ :title ]
order "Time" , [ :created_at ]
end
< thead >
< tr >
<% @search . order_directions . each do | order , direction | %>
< th >
<%= link_to_search order , @search . toggle_order ( order ) %>
<%= img_tag " #{ direction || "unsorted" } _icon.png" %>
</ th >
<% end %>
</ tr >
</ thead >
โปรดจำไว้ว่าสามารถใช้คำสั่งซื้อได้ครั้งละหนึ่งคำสั่งซื้อเท่านั้น ดังนั้นค่าใน Hash สูงสุดเพียงค่าเดียวเท่านั้นที่จะไม่เป็น nil
เพิ่มอัญมณีลงใน Gemfile ของคุณ:
$ bundle add talent_scout
และรันตัวสร้างการติดตั้ง:
$ rails generate talent_scout:install
รัน bin/test
เพื่อรันการทดสอบ
ใบอนุญาตเอ็มไอที