ค้นหา Rails และ ActiveRecord ได้ทันทีโดยใช้มุมมองที่เป็นรูปธรรมของ SQL
ดูแอปสาธิต (รหัสที่พบใน demo_app/
โฟลเดอร์):
เพิ่มความสามารถในการค้นหาที่รวดเร็วทันใจให้กับแอป Rails ของคุณโดยไม่ต้องใช้ระบบภายนอก เช่น ElasticSearch ตอนนี้การสร้างนิพจน์ ActiveRecord/Arel ที่เรารู้จักและชื่นชอบอยู่แล้วกลายเป็นเรื่องง่ายอย่างน่าอัศจรรย์ และแปลงให้เป็นมุมมองที่เป็นรูปธรรมของ SQL ซึ่งพร้อมที่จะถูกสอบถามและเรียบเรียงด้วย ActiveRecord ทุกสิ่งที่คุณรักเกี่ยวกับ Rails แต่เร็วกว่า
อะไรทำให้ Rails การค้นหาช้าลง ตารางขนาดใหญ่ การรวมจำนวนมาก แบบสอบถามย่อย ดัชนีที่ขาดหายไปหรือไม่ได้ใช้ และแบบสอบถามที่ซับซ้อน ช้ายัง? ประสานงานข้อมูลจากระบบภายนอกหลายระบบผ่าน Ruby เพื่อสร้างผลการค้นหา
SearchCraft ทำให้การเขียนและใช้ มุมมองที่เป็นรูปธรรมของ SQL ที่มีประสิทธิภาพเพื่อคำนวณผลลัพธ์การค้นหาและการรายงานล่วงหน้าของคุณเป็นเรื่องเล็กน้อย มันเหมือนกับดัชนีฐานข้อมูล แต่สำหรับการสืบค้นที่ซับซ้อน
มุมมองที่เป็นรูปธรรมเป็นคุณสมบัติที่ยอดเยี่ยมของ PostgreSQL, Oracle และ SQL Server* เป็นตารางผลลัพธ์ที่คำนวณไว้ล่วงหน้าของแบบสอบถาม พวกเขารวดเร็วในการสืบค้น พวกเขายอดเยี่ยมมาก เช่นเดียวกับระบบการค้นหาอื่นๆ คุณสามารถควบคุมได้ว่าต้องการรีเฟรชข้อมูลใหม่เมื่อใด
ภายใน Rails และ ActiveRecord คุณสามารถเข้าถึงมุมมองที่เป็นรูปธรรมแบบอ่านอย่างเดียวได้เหมือนกับที่คุณเข้าถึงตารางทั่วไป คุณสามารถเข้าร่วมด้วยกันได้ คุณสามารถใช้สิ่งเหล่านี้ในโมเดล ขอบเขต และการเชื่อมโยง ActiveRecord ของคุณ
class ProductSearch < ActiveRecord :: Base
include SearchCraft :: Model
end
เสร็จแล้ว. คอลัมน์ใดก็ตามที่คุณอธิบายในมุมมองของคุณจะกลายเป็นคุณลักษณะของโมเดลของคุณ
หากมุมมองพื้นฐานมีคอลัมน์ product_id
, product_name
, reviews_count
และ reviews_average
คุณสามารถสืบค้นได้เหมือนกับโมเดล ActiveRecord อื่นๆ:
ProductSearch . all
[ #<ProductSearch product_id: 2, product_name: "iPhone 15", reviews_count: 5, reviews_average: 0.38e1>,
#<ProductSearch product_id: 1, product_name: "Laptop 3", reviews_count: 5, reviews_average: 0.28e1>,
#<ProductSearch product_id: 4, product_name: "Monopoly", reviews_count: 3, reviews_average: 0.2e1>]
ProductSearch . order ( reviews_average : :desc )
[ #<ProductSearch product_id: 2, product_name: "iPhone 15", reviews_count: 5, reviews_average: 0.38e1>,
#<ProductSearch product_id: 1, product_name: "Laptop 3", reviews_count: 5, reviews_average: 0.28e1>,
#<ProductSearch product_id: 4, product_name: "Monopoly", reviews_count: 3, reviews_average: 0.2e1>]
หากคุณรวมคีย์นอก คุณจะสามารถใช้การเชื่อมโยง belongs_to
ได้ คุณสามารถเพิ่มขอบเขตได้ คุณสามารถเพิ่มวิธีการได้ คุณสามารถใช้เป็นจุดเริ่มต้นสำหรับการสืบค้นกับฐานข้อมูล SQL ที่เหลือของคุณได้ มันเป็นเพียงรุ่น ActiveRecord ทั่วไป
ทั้งหมดนี้เป็นไปได้แล้วด้วย Rails และ ActiveRecord ความสำเร็จของ SearchCraft คือการทำให้การใช้ชีวิตร่วมกับมุมมองที่เป็นรูปธรรมของคุณเป็นเรื่องเล็กน้อย เล็กน้อยเพื่อรีเฟรชและเขียนมัน
SearchCraft แต่ละรายการจะแสดงภาพรวมของผลลัพธ์ของแบบสอบถาม ณ เวลาที่ถูกสร้างขึ้นหรือรีเฟรชครั้งล่าสุด มันเหมือนกับตารางที่มีเนื้อหามาจากแบบสอบถาม
หากข้อมูลที่ซ่อนอยู่ในมุมมอง SearchCraft ของคุณเปลี่ยนแปลงและคุณต้องการรีเฟรช ให้เรียก refresh!
ในคลาสโมเดลของคุณ สิ่งนี้จัดทำโดย SearchCraft::Model
mixin
ProductSearch . refresh!
คุณสามารถส่งความสัมพันธ์/อาร์เรย์ ActiveRecord นี้ไปยังมุมมอง Rails ของคุณและเรนเดอร์ได้ คุณสามารถรวมเข้ากับตารางอื่นและใช้ขอบเขตเพิ่มเติมได้
แต่คุณสมบัติที่ยิ่งใหญ่ที่สุดของ SearchCraft คือช่วยให้คุณ เขียนมุมมองที่เป็นรูปธรรมของคุณ จากนั้นจึงทำซ้ำอีกครั้ง
ออกแบบในนิพจน์ ActiveRecord, นิพจน์ Arel หรือแม้แต่ SQL ธรรมดา ไม่มีการโยกย้ายเพื่อย้อนกลับและเรียกใช้ใหม่ ไม่มีการติดตามว่ามุมมอง SQL ในฐานข้อมูลของคุณตรงกับโค้ด SearchCraft ในแอป Rails ของคุณหรือไม่ SearchCraft จะสร้างและอัปเดตมุมมองที่เป็นรูปธรรมของคุณโดยอัตโนมัติ
อัปเดตมุมมอง SearchCraft ของคุณ ดำเนินการทดสอบ ซึ่งทำงานได้ อัปเดตมุมมอง SearchCraft รีเฟรชแอปการพัฒนา และใช้งานได้ เปิด rails console
แล้วใช้งานได้ จากนั้นอัปเดตมุมมองของคุณ พิมพ์ reload!
และมันก็ได้ผล ปรับใช้กับการผลิตได้ทุกที่และใช้งานได้
การออกแบบมุมมองที่เป็นรูปธรรมด้วย SearchCraft มีลักษณะอย่างไร สำหรับโมเดล ProductSearch
ของเราด้านบน เราสร้างคลาส ProductSearchBuilder
ที่สืบทอดมาจาก SearchCraft::Builder
และจัดเตรียมเมธอด view_scope
หรือเมธอด view_select_sql
class ProductSearchBuilder < SearchCraft :: Builder
def view_scope
Product . where ( active : true )
. select (
"products.id AS product_id" ,
"products.name AS product_name" ,
"(SELECT COUNT(*) FROM product_reviews WHERE product_reviews.product_id = products.id) AS reviews_count" ,
"(SELECT AVG(rating) FROM product_reviews WHERE product_reviews.product_id = products.id) AS reviews_average"
)
end
end
วิธีการ view_scope
ต้องส่งคืนความสัมพันธ์ ActiveRecord มันอาจจะง่ายหรือซับซ้อนตามที่คุณต้องการ สามารถใช้การรวม แบบสอบถามย่อย และสิ่งอื่นๆ ที่คุณสามารถทำได้ด้วย ActiveRecord ในตัวอย่างข้างต้น เรา:
id
และ name
จากตาราง products
โดยที่เราสามารถใช้ product_id
เป็นคีย์ต่างประเทศเพื่อเชื่อมต่อกับโมเดล Product
ในแอปของเราได้ในภายหลังreviews_count
และ reviews_average
ใหม่โดยใช้แบบสอบถามย่อย SQL ที่นับและหาค่าเฉลี่ยของคอลัมน์ rating
จากตาราง product_reviews
SearchCraft จะแปลงสิ่งนี้ให้เป็นมุมมองที่เป็นรูปธรรม สร้างลงในฐานข้อมูลของคุณ และโมเดล ProductSearch
ด้านบนจะเริ่มใช้งานเมื่อคุณโหลดแอปการพัฒนาซ้ำหรือรันการทดสอบครั้งถัดไป หากคุณทำการเปลี่ยนแปลง SearchCraft จะดรอปและสร้างมุมมองใหม่โดยอัตโนมัติ
เมื่อเราโหลดแอปของเราลงในคอนโซล Rails หรือรันการทดสอบของเรา หรือรีเฟรชแอปการพัฒนา โมเดล ProductSearch
จะได้รับการอัปเดตโดยอัตโนมัติเพื่อให้ตรงกับการเปลี่ยนแปลงใดๆ ใน ProductSearchBuilder
ProductSearch . all
[ #<ProductSearch product_id: 2, product_name: "iPhone 15", reviews_count: 5, reviews_average: 0.38e1>,
#<ProductSearch product_id: 1, product_name: "Laptop 3", reviews_count: 5, reviews_average: 0.28e1>,
#<ProductSearch product_id: 4, product_name: "Monopoly", reviews_count: 3, reviews_average: 0.2e1>]
ProductSearch . order ( reviews_average : :desc )
[ #<ProductSearch product_id: 2, product_name: "iPhone 15", reviews_count: 5, reviews_average: 0.38e1>,
#<ProductSearch product_id: 1, product_name: "Laptop 3", reviews_count: 5, reviews_average: 0.28e1>,
#<ProductSearch product_id: 4, product_name: "Monopoly", reviews_count: 3, reviews_average: 0.2e1>]
หากคุณต้องการเขียน SQL คุณสามารถใช้เมธอด view_select_sql
แทนได้
class NumberBuilder < SearchCraft :: Builder
# Write SQL that produces 5 rows, with a 'number' column containing the number of the row
def view_select_sql
"SELECT generate_series(1, 5) AS number;"
end
end
class Number < ActiveRecord :: Base
include SearchCraft :: Model
end
Number . all
[ #<Number number: 1>, #<Number number: 2>, #<Number number: 3>, #<Number number: 4>, #<Number number: 5>]
คุณลักษณะที่ยอดเยี่ยมของมุมมองที่เป็นรูปธรรมคือคุณสามารถเพิ่มดัชนีลงในมุมมองเหล่านั้นได้ แม้แต่ดัชนีที่ไม่ซ้ำใคร
ขณะนี้กลไกในการเพิ่มดัชนีคือการเพิ่มเมธอด view_indexes
ให้กับคลาสตัวสร้างของคุณ
ตัวอย่างเช่น เราสามารถเพิ่มดัชนีเฉพาะในคอลัมน์ number
ของ NumberBuilder
:
class NumberBuilder < SearchCraft :: Builder
def view_indexes
{
number : { columns : [ "number" ] , unique : true }
}
end
หรือดัชนีหลายรายการใน ProductSearchBuilder
จากรุ่นก่อนหน้า:
class ProductSearchBuilder < SearchCraft :: Builder
def view_indexes
{
id : { columns : [ "product_id" ] , unique : true } ,
product_name : { columns : [ "product_name" ] } ,
reviews_count : { columns : [ "reviews_count" ] } ,
reviews_average : { columns : [ "reviews_average" ] }
}
end
end
โดยค่าเริ่มต้น ดัชนีจะ using: :btree
วิธีการสร้างดัชนี คุณยังสามารถใช้วิธีการสร้างดัชนีอื่นๆ ที่มีอยู่ใน Rails ได้ เช่น :gin
, :gist
หรือหากคุณใช้ส่วนขยาย trigram
ก็สามารถใช้ :gin_trgm_ops
ได้ สิ่งเหล่านี้มีประโยชน์เมื่อคุณกำลังดูการตั้งค่าการค้นหาข้อความ ตามที่อธิบายไว้ด้านล่าง
ข้อดีอีกประการหนึ่งของมุมมองที่เป็นรูปธรรมก็คือ เราสามารถสร้างคอลัมน์ที่ปรับให้เหมาะสมสำหรับการค้นหาได้ ตัวอย่างข้างต้น เนื่องจากเราได้คำนวณ reviews_average
ไว้ล่วงหน้าใน ProductSearchBuilder
เราจึงสามารถค้นหาผลิตภัณฑ์ที่มีคะแนนเฉลี่ยที่แน่นอนได้อย่างง่ายดาย
ProductSearch . where ( "reviews_average > 4" )
คุณสมบัติที่ยอดเยี่ยมของ ActiveRecord คือความสามารถในการรวมข้อความค้นหาเข้าด้วยกัน เนื่องจากมุมมองที่เป็นรูปธรรมของเราเป็นโมเดล ActiveRecord ดั้งเดิม เราจึงสามารถรวมมุมมองเหล่านั้นเข้ากับแบบสอบถามอื่นๆ ได้
มาตั้งค่าการเชื่อมโยงระหว่าง ProductSearch#product_id
ของ MV ของเรากับคีย์หลัก Product#id
ของตาราง:
class ProductSearch < ActiveRecord :: Base
include SearchCraft :: Model
belongs_to :product , foreign_key : :product_id , primary_key : :id
end
ตอนนี้เราสามารถเข้าร่วมหรือโหลดตารางร่วมกับแบบสอบถาม ActiveRecord ได้แล้ว ต่อไปนี้จะส่งคืนความสัมพันธ์ของออบเจ็กต์ ProductSearch
โดยแต่ละการเชื่อมโยง ProductSearch#product
จะถูกโหลดไว้ล่วงหน้า
ProductSearch . includes ( :product ) . where ( "reviews_average > 4" )
ต่อไปนี้จะส่งคืนออบเจ็กต์ Product
โดยขึ้นอยู่กับการค้นหามุมมอง ProductSearch
ที่เป็นรูปธรรม:
class Product
has_one :product_search , foreign_key : :product_id , primary_key : :id , class_name : "ProductSearch"
end
Product . joins ( :product_searches ) . merge (
ProductSearch . where ( "reviews_average > 4" )
)
PostgreSQL มาพร้อมกับโซลูชันสำหรับการค้นหาข้อความโดยใช้ฟังก์ชันต่างๆ ร่วมกัน เช่น to_tsvector
, ts_rank
และ websearch_to_tsquery
รอเอกสารเพิ่มเติม โปรดดูที่ test/searchcraft/builder/test_text_search.rb
สำหรับตัวอย่างวิธีใช้ฟังก์ชันเหล่านี้ในมุมมองที่เป็นรูปธรรมของคุณ
ฉันยังคงพยายามแยกโซลูชันนี้ออกจากโค้ดของเราที่ Store Connect
เมื่อคุณมีมุมมองที่เป็นรูปธรรมของ SearchCraft หนึ่งมุมมองแล้ว คุณอาจต้องการสร้างมุมมองอื่นที่ขึ้นอยู่กับมุมมองนั้น คุณสามารถทำได้โดยใช้เมธอด depends_on
class SquaredBuilder < SearchCraft :: Builder
depends_on "NumberBuilder"
def view_select_sql
"SELECT number, number * number AS squared FROM #{ Number . table_name } ;"
end
end
class Squared < ActiveRecord :: Base
include SearchCraft :: Model
end
หากคุณทำการเปลี่ยนแปลงกับ NumberBuilder
จากนั้น SearchCraft จะปล่อยและสร้างมุมมองที่เป็นรูปธรรมทั้ง Number
และ Squared
ขึ้นมาใหม่โดยอัตโนมัติ
Squared . all
[ #<Squared number: 1, squared: 1>,
#<Squared number: 2, squared: 4>,
#<Squared number: 3, squared: 9>,
#<Squared number: 4, squared: 16>,
#<Squared number: 5, squared: 25>]
ไม่มั่นใจในการเขียนนิพจน์ SQL หรือ Arel ที่ซับซ้อนใช่ไหม ฉันก็เช่นกัน ฉันถาม GPT4 หรือ GitHub Copilot ฉันอธิบายลักษณะของสคีมาและตารางของฉัน และขอให้เขียน SQL บางส่วน จากนั้นขอให้แปลงเป็น Arel หรือฉันให้ตัวอย่างเล็กๆ น้อยๆ ของ SQL และขอให้แปลงเป็น Arel จากนั้นฉันคัดลอก/วางผลลัพธ์ลงในคลาสตัวสร้าง SearchCraft ของฉัน
การเรียนรู้ที่จะแสดงคำค้นหาของคุณใน SQL หรือ Arel เป็นสิ่งที่คุ้มค่าอย่างยิ่ง และนำไปไว้ในมุมมองที่เป็นรูปธรรมของ SearchCraft ผู้ใช้ของคุณจะได้รับประสบการณ์ที่รวดเร็วปานสายฟ้า
ภายในแอป Rails ให้เพิ่มอัญมณีลงใน Gemfile ของคุณ:
bundle add searchcraft
SearchCraft จะสร้างตาราง DB ภายในที่ต้องการโดยอัตโนมัติ ดังนั้นจึงไม่มีการโยกย้ายฐานข้อมูลให้ดำเนินการ และแน่นอนว่ามันจะสร้างและสร้างมุมมองที่เป็นรูปธรรมของคุณขึ้นมาใหม่โดยอัตโนมัติ
ภายในแอป Rails คุณสามารถปฏิบัติตามพร้อมกับบทช่วยสอนนี้ หากคุณไม่มีแอป Rails ให้ใช้แอปที่พบในโฟลเดอร์ demo_app
ของโปรเจ็กต์นี้
ติดตั้งอัญมณี:
bundle add searchcraft
เลือกหนึ่งในโมเดลแอปพลิเคชันที่มีอยู่ของคุณ พูดว่า Product
แล้วเราจะสร้างมุมมองที่เป็นรูปธรรมเล็กน้อยสำหรับโมเดลนั้น สมมติว่าเราต้องการวิธีที่รวดเร็วเพื่อให้ได้ผลิตภัณฑ์ที่ขายดีที่สุด 5 อันดับแรก และรายละเอียดบางอย่างเราจะใช้ในมุมมอง HTML ของเรา
สร้างไฟล์โมเดล ActiveRecord ใหม่ app/models/product_latest_arrival.rb
:
class ProductLatestArrival < ActiveRecord :: Base
include SearchCraft :: Model
end
ตามแบบแผนของ Rails โมเดลนี้จะค้นหาตาราง SQL หรือมุมมองที่เรียกว่า product_latest_arrivals
สิ่งนี้ยังไม่มี
เราสามารถยืนยันสิ่งนี้ได้โดยเปิด rails console
แล้วลองค้นหา:
ProductLatestArrival . all
# ActiveRecord::StatementInvalid ERROR: relation "product_latest_arrivals" does not exist
เราสามารถสร้างคลาสตัวสร้าง SearchCraft ใหม่เพื่อกำหนดมุมมองที่เป็นรูปธรรมของเรา สร้างไฟล์ใหม่ app/searchcraft/product_latest_arrival_builder.rb
ฉันขอแนะนำ app/searchcraft
สำหรับผู้สร้างของคุณ แต่พวกเขาสามารถเข้าไปใน app/
โฟลเดอร์ย่อยใดๆ ที่ Rails โหลดอัตโนมัติ
class ProductLatestArrivalBuilder < SearchCraft :: Builder
def view_scope
Product . order ( created_at : :desc ) . limit ( 5 )
end
end
ภายใน rails console``, run
reload!` และตรวจสอบคำค้นหาของคุณอีกครั้ง:
reload!
ProductLatestArrival . all
ProductLatestArrival Load ( 1.3 ms ) SELECT "product_latest_arrivals" . * FROM "product_latest_arrivals"
=>
[ #<ProductLatestArrival:0x000000010a737d18
id : 1 ,
name : "Rustic Wool Coat" ,
active : true ,
created_at : Fri , 25 Aug 2023 07 :15 :16 . 995228000 UTC + 00 : 00 ,
updated_at : Fri , 25 Aug 2023 07 :15 :16 . 995228000 UTC + 00 : 00 ,
image_url : "https://loremflickr.com/g/320/320/coat?lock=1" > ,
...
หากคุณติดตั้ง annotate
Gem ใน Gemfile
ของคุณ คุณจะทราบด้วยว่าโมเดล product_latest_arrival.rb
ได้รับการอัปเดตเพื่อแสดงคอลัมน์ในมุมมองที่เป็นรูปธรรม
# == Schema Information
#
# Table name: product_latest_arrivals
#
# id :bigint
# name :string
# active :boolean
# created_at :datetime
# updated_at :datetime
# image_url :string
#
class ProductLatestArrival < ActiveRecord :: Base
include SearchCraft :: Model
end
หากแอปพลิเคชันของคุณอยู่ภายใต้การควบคุมแหล่งที่มา คุณจะยังเห็นว่า db/schema.rb
ได้รับการอัปเดตเพื่อแสดงข้อกำหนดมุมมองล่าสุด รัน git diff db/schema.rb
:
create_view "product_latest_arrivals" , materialized : true , sql_definition : <<-SQL
SELECT products.id,
products.name,
products.active,
products.created_at,
products.updated_at,
products.image_url
FROM products
LIMIT 5;
SQL
ตอนนี้คุณสามารถเปลี่ยน view_scope
ในเครื่องมือสร้างของคุณต่อไป และดำเนินการ reload!
ในคอนโซล Rails เพื่อทดสอบการเปลี่ยนแปลงของคุณ
ตัวอย่างเช่น คุณสามารถ select()
เฉพาะคอลัมน์ที่คุณต้องการใช้นิพจน์ SQL สำหรับแต่ละคอลัมน์ได้:
class ProductLatestArrivalBuilder < SearchCraft :: Builder
def view_scope
Product
. order ( created_at : :desc )
. limit ( 5 )
. select (
"products.id as product_id" ,
"products.name as product_name" ,
"products.image_url as product_image_url" ,
)
end
end
หรือคุณสามารถใช้นิพจน์ Arel เพื่อสร้าง SQL ได้:
class ProductLatestArrivalBuilder < SearchCraft :: Builder
def view_scope
Product
. order ( created_at : :desc )
. limit ( 5 )
. select (
Product . arel_table [ :id ] . as ( "product_id" ) ,
Product . arel_table [ :name ] . as ( "product_name" ) ,
Product . arel_table [ :image_url ] . as ( "product_image_url" ) ,
)
end
end
แล้วการอัพเดตข้อมูลล่ะ? มาสร้าง Products
เพิ่มเติม:
Product . create! ( name : "Starlink" )
Product . create! ( name : "Fishing Rod" )
หากคุณต้องตรวจสอบ ProductLatestArrival.all
คุณจะ ไม่พบ ผลิตภัณฑ์ใหม่เหล่านี้ เนื่องจากมุมมองที่เป็นรูปธรรมคือสแน็ปช็อตของข้อมูล ณ เวลาที่ถูกสร้างขึ้นหรือรีเฟรชครั้งล่าสุด
หากต้องการรีเฟรชมุมมอง:
ProductLatestArrival . refresh!
อีกทางหนึ่ง เพื่อรีเฟรชมุมมองทั้งหมด:
SearchCraft :: Model . refresh_all!
และขอยืนยันว่าสินค้าใหม่ล่าสุดอยู่ในมุมมองที่เป็นรูปธรรมแล้ว:
ProductLatestArrival . pluck ( :name )
=> [ "Fishing Rod" , "Starlink" , "Sleek Steel Bag" , "Ergonomic Plastic Bench" , "Fantastic Wooden Keyboard" ]
หากคุณต้องการลบสิ่งประดิษฐ์ของบทช่วยสอนนี้ ขั้นแรก ให้ปล่อยมุมมองที่เป็นรูปธรรมออกจากสคีมาฐานข้อมูลของคุณ:
ProductLatestArrivalBuilder . new . drop_view!
จากนั้นลบไฟล์และ git checkout .
เพื่อคืนค่าการเปลี่ยนแปลงอื่นๆ
rm app/searchcraft/product_latest_arrival_builder.rb
rm app/models/product_latest_arrival.rb
git checkout db/schema.rb
SearchCraft จัดเตรียมงานเรคสองงาน:
rake searchcraft:refresh
- รีเฟรชมุมมองที่ปรากฏทั้งหมดrake searchcraft:rebuild
- ตรวจสอบว่าจำเป็นต้องสร้างมุมมองใหม่หรือไม่ หากต้องการเพิ่มสิ่งเหล่านี้ลงในแอป Rails ให้เพิ่มสิ่งต่อไปนี้ที่ด้านล่างของ Rakefile
ของคุณ:
SearchCraft . load_tasks
Builder
และตรวจพบการเปลี่ยนแปลงโดยอัตโนมัติเพื่อทำให้สคีมามุมมองเป็นจริงและสร้างมันขึ้นมาใหม่refresh!
ของเนื้อหาการดูที่เป็นรูปธรรมdb/schema.rb
ทุกครั้งที่อัปเดตมุมมองที่เป็นรูปธรรมannotate
gemrake searchcraft:refresh
และตรวจสอบว่าจำเป็นต้องสร้างมุมมองใด ๆ ขึ้นมาใหม่ rake searchcraft:rebuild
หลังจากตรวจสอบ repo แล้ว ให้รัน bin/setup
เพื่อติดตั้งการขึ้นต่อกัน จากนั้นรัน rake test
เพื่อทำการทดสอบ คุณยังสามารถเรียกใช้ bin/console
เพื่อรับข้อความโต้ตอบที่จะช่วยให้คุณสามารถทดลองได้
หากต้องการติดตั้ง gem นี้ลงในเครื่องของคุณ ให้รัน bundle exec rake install
หากต้องการออกเวอร์ชันใหม่ ให้อัปเดตหมายเลขเวอร์ชันใน version.rb
จากนั้นเรียกใช้ bundle exec rake release
ซึ่งจะสร้างแท็ก git สำหรับเวอร์ชัน กด git commits และแท็กที่สร้างขึ้น จากนั้นส่งไฟล์ .gem
ไปที่ rubygems องค์กร
หากต้องการเพิ่มหมายเลขเวอร์ชัน:
gem bump
เช่น gem bump -v patch
demo_app/Gemfile.lock
เช่น (cd demo_app; bundle)
git add demo_app/Gemfile.lock; git commit --amend --no-edit
rake release
ปล่อย gem bump -v patch
(cd demo_app; bundle)
git add demo_app/Gemfile.lock; git commit --amend --no-edit
git push
rake release
รายงานข้อผิดพลาดและคำขอดึงข้อมูลยินดีต้อนรับบน GitHub ที่ https://github.com/drnic/searchcraft โครงการนี้มีวัตถุประสงค์เพื่อเป็นพื้นที่ที่ปลอดภัยและเป็นมิตรสำหรับการทำงานร่วมกัน และผู้มีส่วนร่วมจะต้องปฏิบัติตามหลักจรรยาบรรณ
อัญมณีนี้มีให้ใช้งานในรูปแบบโอเพ่นซอร์สภายใต้เงื่อนไขของใบอนุญาต MIT
ทุกคนที่โต้ตอบในโค้ดเบส เครื่องมือติดตามปัญหา ห้องสนทนา และรายชื่ออีเมลของโครงการ Searchcraft จะต้องปฏิบัติตามหลักจรรยาบรรณ
rails db:rollback
สร้างการโยกย้าย SQL ใหม่ rails db:migrate
จากนั้นทดสอบ - ช้า นอกจากนี้ยังมีข้อบกพร่อง - ฉันจะลืมดำเนินการตามขั้นตอนแล้วเห็นพฤติกรรมแปลก ๆ หากคุณมีมุมมองที่ค่อนข้างคงที่หรือมุมมองที่เป็นรูปธรรม และต้องการใช้การโยกย้าย Rails โปรดลองใช้ scenic
Gem อัญมณี searchcraft
นี้ยังคงขึ้นอยู่ scenic
ฟีเจอร์ refresh
มุมมอง และเพิ่มมุมมองลงใน schema.rb