Arel in Rails 3.0 คืออะไร?


86

ฉันเข้าใจว่าเป็นการแทนที่ ActiveRecord และใช้วัตถุแทนการสืบค้น

แต่...

ทำไมถึงดีกว่านี้?

ออบเจ็กต์ / คิวรีจะสร้าง "ง่ายกว่า" ไหม

จะนำไปสู่การสืบค้น SQL ที่มีประสิทธิภาพมากขึ้นหรือไม่?

จะเข้ากันได้กับฐานข้อมูลหลักทั้งหมดหรือไม่ - ฉันคิดว่ามันจะ

มันจะง่าย / ยากกว่าที่จะใช้กับขั้นตอนการจัดเก็บ?

คำตอบ:


182

Arel in Rails 3.0 คืออะไร?

เป็นแบบจำลองวัตถุสำหรับพีชคณิตของตัวดำเนินการแบบสอบถามเชิงสัมพันธ์

ฉันเข้าใจว่ามันเป็นการแทนที่ ActiveRecord

ไม่มันไม่ใช่ เป็นการแทนที่แบบสอบถาม SQL ที่สร้างด้วยมือในสตริง เป็นเลเยอร์การสืบค้นทั่วไปที่อยู่ภายใต้ ActiveRecord แต่ยังสามารถใช้เป็นส่วนเสริมสำหรับ DataMapper ได้เช่นกัน

หากเป็นการแทนที่สิ่งใดสิ่งหนึ่งจะเป็นการแทนที่ Ambition หรือคุณอาจคิดว่ามันเป็นเวอร์ชัน Ruby ของตัวดำเนินการสืบค้นมาตรฐาน LINQ หรือ SQLAlchemy ของ Python (ในความเป็นจริงผู้เขียนอ้างถึงทั้ง LINQ และ SQLAlchemy อย่างชัดเจนว่าเป็นแรงบันดาลใจ)

หรือคุณสามารถมองว่ามันใช้แทนnamed_scopes ในความเป็นจริง ARel ค่อนข้างตระหนักถึงแนวคิดที่ว่า "ทุกการสืบค้นคือ a named_scope" และ whaddayaknow: ทั้งคู่เขียนโดยผู้ชายคนเดียวกัน

และใช้วัตถุแทนการสืบค้น

ไม่ใช้วัตถุเป็นแบบสอบถาม

ทำไมถึงดีกว่านี้?

Ruby เป็นภาษาเชิงวัตถุไม่ใช่ภาษาเชิงสตริง ด้วยเหตุนี้เพียงอย่างเดียวจึงเหมาะสมที่จะแสดงคิวรีเป็นอ็อบเจกต์แทนสตริง การสร้างโมเดลอ็อบเจ็กต์ที่เหมาะสมสำหรับคิวรีแทนที่จะใช้สตริงสำหรับทุกสิ่งจะให้คุณได้รับประโยชน์เช่นเดียวกันกับการสร้างโมเดลอ็อบเจ็กต์ที่เหมาะสมสำหรับระบบบัญชีแทนที่จะใช้สตริงสำหรับทุกสิ่ง

ข้อดีอีกอย่างคือ ARel ใช้พีชคณิตจริงของตัวดำเนินการสืบค้น กล่าวอีกนัยหนึ่ง ARel รู้เกี่ยวกับกฎทางคณิตศาสตร์สำหรับการสร้างและการเขียนคำค้นหา หากคุณเชื่อมสตริงสองสตริงเข้าด้วยกันซึ่งแต่ละสตริงมีคิวรี SQL ที่ถูกต้องผลลัพธ์อาจจะไม่ใช่คิวรี SQL ที่ถูกต้อง หรือที่แย่กว่านั้นคือเป็นแบบสอบถาม SQL ที่ถูกต้อง แต่เป็นแบบสอบถามที่ไม่สมเหตุสมผลหรือมีบางอย่างที่แตกต่างไปจากที่คุณคิดโดยสิ้นเชิง สิ่งนี้ไม่สามารถเกิดขึ้นได้กับ ARel (นี่คือสิ่งที่บทความที่ฉันลิงก์ไปด้านล่างหมายถึง "ปิดภายใต้การเรียบเรียง")

ออบเจ็กต์ / คิวรีจะสร้าง "ง่ายกว่า" ไหม

ใช่. ตัวอย่างเช่นดังที่ฉันได้กล่าวไว้ข้างต้นการสร้างแบบสอบถามที่ซับซ้อนขึ้นจากส่วนที่ง่ายกว่านั้นง่ายกว่ามาก

จะนำไปสู่การสืบค้น SQL ที่มีประสิทธิภาพมากขึ้นหรือไม่?

ใช่. ความจริงที่ว่า ARel มีโมเดลอ็อบเจ็กต์ที่เหมาะสมสำหรับคิวรีหมายความว่าสามารถทำการปรับให้เหมาะสมกับคิวรีเหล่านั้นได้นานก่อนที่จะสร้างคิวรี SQL จริง

จะเข้ากันได้กับฐานข้อมูลหลักทั้งหมดหรือไม่ - ฉันคิดว่ามันจะ

ใช่. อันที่จริงฉันมักจะพูดถึง SQL ด้านบน แต่จริงๆแล้วพีชคณิตแบบสอบถามเชิงสัมพันธ์สามารถสร้างแบบสอบถามสำหรับทุกสิ่งได้ อีกครั้งดู LINQ หรือ Ambition เป็นตัวอย่าง: ทั้งสองสามารถสืบค้น SQL, LDAP, ActiveResource, CouchDB, Amazon, Google, ... ทั้งหมดด้วยไวยากรณ์เดียวกัน

บางทีการอภิปรายที่ดีที่สุดเกี่ยวกับ ARel คืออะไรและทำไม Nick Kallen จึงเขียนเป็นบทความชื่อ aptly Why Arel? โดย Nick Kallenเอง หมายเหตุ: บทความนี้มีศัพท์แสงทางคณิตศาสตร์และวิทยาศาสตร์คอมพิวเตอร์เล็กน้อย แต่นั่นคือประเด็น: ARel มีพื้นฐานที่แข็งแกร่งในคณิตศาสตร์และวิทยาศาสตร์คอมพิวเตอร์รากฐานเหล่านี้คือสิ่งที่ให้คุณสมบัติที่ทรงพลัง


คำตอบที่ยอดเยี่ยม ฉันได้อ่านลิงค์ที่คุณโพสต์และติดตามเป็นส่วนใหญ่ ในความเป็นจริงส่วน comp sci นั้นสมเหตุสมผล แต่วิธีที่รวมเข้ากับรางคือจุดที่ฉันมีปัญหา มันสมเหตุสมผลกว่าสำหรับฉันที่มันแทนที่ SQL ที่สร้างขึ้นด้วยมือ (หรืออะไรก็ได้) ดังนั้น AR จึงถูกสร้างขึ้นบน 3.0 ฉันได้รับความประทับใจที่แตกต่างกันสำหรับผู้ที่ควรรู้ดีกว่าและคำตอบนี้ยอดเยี่ยมในคำอธิบายที่เรียบง่ายและแม่นยำของแต่ละคำถามข้างต้น
จะ

ฉันมีคำถามติดตามผลหนึ่งข้อ คุณกล่าวถึง LDAP, AMZ และอื่น ๆ ข้างต้นฉันคิดว่าปัจจุบัน (อิงตามราง / arel บน github) ARel ไม่มีความสามารถนั้นมีเพียงศักยภาพ? เช่นจนกว่าจะมีคนนำส่วนนั้นไปใช้ นี่ฟังดูน่าตื่นเต้นสุด ๆ
จะ

2
@ จะ - ฉันคิดว่าคุณจะต้องรอให้ใครสักคนพัฒนาความสามารถที่สนุกกว่านี้ หรือทุบด้วยตัวเองคุณควรต้องการหรือไม่?
Mike Woodhouse

1
+1 แม้ว่าลิงก์จะตาย การค้นหาที่ไร้เดียงสาไม่พบลิงก์ปัจจุบัน
Dave Newton

@DaveNewton: เห็นได้ชัดว่ามันหายไปแล้ว มีสำเนาแคชลอยอยู่รอบ ๆ เช่นbmark.us/bmark/readable/913ff84fc0dcdc
Jörg W Mittag

19

ARel น่าเสียดายที่เชื่อมโยงโดยตรงกับการสร้าง SQL ดังนั้นจึงไม่เหมาะกับความต้องการของ DataMapper

วิธีที่ฉันจะใส่ก็คือ ARel เป็นโมเดลแบบสอบถามที่ชัดเจนสำหรับ ActiveRecord ที่สร้างและเพิ่มประสิทธิภาพการสืบค้น SQL สำหรับ RDBMSes

ในทางกลับกัน DataMapper เป็นผู้ทำแผนที่ของแท้สำหรับข้อมูลและสามารถเชื่อมต่อกับที่เก็บข้อมูลที่ไม่ใช่เชิงสัมพันธ์ได้อยู่แล้ว ในอนาคต DataMapper มีแนวโน้มที่จะรวมไลบรารีแยกต่างหากที่เรียกว่า Veritas ซึ่งมีวัตถุประสงค์เพื่อให้ฟังก์ชันเชิงสัมพันธ์กับข้อมูลที่มาจากที่เก็บข้อมูลใด ๆ ไม่ใช่เฉพาะ RDBMSes


10
ฉันเป็นผู้ดูแล DataMapper และสิ่งที่รู้บอกว่าเป็นความจริง ARel ในการใช้งานปัจจุบันไม่สามารถใช้ภายใต้ DataMapper ได้เนื่องจากมีเพียงส่วนย่อยของฟังก์ชันที่จำเป็นในการทำงานกับที่เก็บข้อมูลมากกว่า 40 รายการที่ DM รองรับ IMHO การใช้งานในปัจจุบันนั้นควบคู่ไปกับการสร้าง SQL อย่างแน่นหนาและจะต้องใช้เวลามากในการแก้ไข API / ภายในเพื่อทำงานกับดาต้าสโตร์ซึ่งแตกต่างจาก RDBMS อย่างมาก ARel ก้าวไปข้างหน้า แต่ไม่สามารถสร้างรากฐานได้มากกว่า ActiveRecord ในขณะนี้
dkubb

1

Arel ใน Rails 3 สร้างวัตถุสัมพันธ์โดยที่ฐานข้อมูลจะไม่ถูกสอบถามจนกว่าคุณจะต้องการ มีประสิทธิภาพมากขึ้น

นอกจากนี้ยังเป็นธรรมชาติมากขึ้น (เมื่อคุณเคยชินแล้ว) ซึ่งเป็นจุดแข็งที่ยิ่งใหญ่ของ Rails


0

อันที่จริงฉันได้เริ่มซีรีส์วิดีโอใน ActiveRelation

สามารถดูบทแนะนำทั่วไปครั้งแรกได้ที่http://Innovative-Studios.com/#pilot


ฉันชอบวิดีโอนี้ด้วย เป็นเรื่องพื้นฐาน แต่ฉันได้รวบรวมข้อมูลใหม่เพิ่มเติมเล็กน้อย ต้องการดูวิดีโอต่อไป!
Purplejacket
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.