คำถามติดแท็ก activerecord

Active Record เป็นรูปแบบที่รวมลอจิกโดเมนกับสตอเรจที่เป็นนามธรรมในออบเจ็กต์เดียว ใช้แท็กนี้สำหรับคำถามเกี่ยวกับรูปแบบ [rail-activerecord] สำหรับคำถามเกี่ยวกับเฟรมเวิร์ก Rails ORM

14
ทำไม Active Record ทั้งหมดถึงเกลียดชัง? [ปิด]
ตามที่กล่าวมาในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบถาม & ตอบของเรา เราคาดหวังว่าคำตอบจะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจก่อให้เกิดการถกเถียงโต้แย้งการสำรวจความคิดเห็นหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงได้และอาจเปิดขึ้นมาใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อรับคำแนะนำ ปิดให้บริการใน8 ปีที่ผ่านมา ขณะที่ผมได้เรียนรู้มากขึ้นเกี่ยวกับ OOP และเริ่มต้นที่จะใช้รูปแบบการออกแบบต่างๆผมให้กลับมาที่กรณีที่มีผู้เกลียดActive Record บ่อยครั้งที่ผู้คนพูดว่ามันปรับขนาดได้ไม่ดี (โดยอ้างว่า Twitter เป็นตัวอย่างหลักของพวกเขา) - แต่ก็ไม่มีใครอธิบายได้ว่าทำไมมันถึงปรับขนาดได้ไม่ดี และ / หรือวิธีบรรลุข้อดีของ AR โดยไม่มีข้อเสีย (ผ่านรูปแบบที่คล้ายกัน แต่แตกต่างกัน?) หวังว่านี่จะไม่กลายเป็นสงครามศักดิ์สิทธิ์เกี่ยวกับรูปแบบการออกแบบ - ทั้งหมดที่ฉันอยากรู้คือ **** โดยเฉพาะ **** มีอะไรผิดปกติกับ Active Record ถ้ามันปรับขนาดได้ไม่ดีทำไมล่ะ? มันมีปัญหาอะไรอีก?

5
ค้นหาแถวที่มีช่องที่ซ้ำกันหลายช่องด้วย Active Record, Rails & Postgres
วิธีใดดีที่สุดในการค้นหาระเบียนที่มีค่าซ้ำกันในหลายคอลัมน์โดยใช้ Postgres และ Activerecord ฉันพบวิธีแก้ปัญหานี้ที่นี่ : User.find(:all, :group => [:first, :email], :having => "count(*) > 1" ) แต่ดูเหมือนจะใช้ไม่ได้กับ postgres ฉันได้รับข้อผิดพลาดนี้: PG :: GroupingError: ข้อผิดพลาด: คอลัมน์ "parts.id" ต้องปรากฏในคำสั่ง GROUP BY หรือใช้ในฟังก์ชันการรวม

8
วิธีเรียกใช้การอัปเดตแบบดิบ sql ด้วยการผูกแบบไดนามิกในราง
ฉันต้องการเรียกใช้การอัปเดตหนึ่งไฟล์ sql ด้านล่าง: update table set f1=? where f2=? and f3=? SQL นี้จะถูกเรียกใช้ActiveRecord::Base.connection.executeงาน แต่ฉันไม่รู้ว่าจะส่งค่าพารามิเตอร์ไดนามิกไปยังเมธอดอย่างไร มีใครให้ความช่วยเหลือฉันได้ไหม

13
ActiveRecord.find (array_of_ids) รักษาการสั่งซื้อ
เมื่อคุณทำSomething.find(array_of_ids)ใน Rails, array_of_idsสั่งซื้อสินค้าของอาร์เรย์ที่เกิดขึ้นไม่ได้ขึ้นอยู่กับคำสั่งของ มีวิธีใดในการค้นหาและรักษาคำสั่งซื้อหรือไม่? ATM ฉันจัดเรียงระเบียนด้วยตนเองตามลำดับของ ID แต่นั่นเป็นเรื่องง่อย UPD: ถ้าเป็นไปได้ที่จะระบุคำสั่งโดยใช้:orderพารามิเตอร์และส่วนคำสั่ง SQL บางประเภทแล้วจะทำอย่างไร?

10
ค้นหาระเบียนทั้งหมดที่มีจำนวนการเชื่อมโยงมากกว่าศูนย์
ฉันกำลังพยายามทำบางสิ่งที่ฉันคิดว่ามันจะง่าย แต่ดูเหมือนจะไม่เป็นเช่นนั้น ฉันมีโมเดลโครงการที่มีตำแหน่งงานว่างมากมาย class Project < ActiveRecord::Base has_many :vacancies, :dependent => :destroy end ฉันต้องการรับโครงการทั้งหมดที่มีตำแหน่งว่างอย่างน้อย 1 ตำแหน่ง ฉันลองทำสิ่งนี้: Project.joins(:vacancies).where('count(vacancies) > 0') แต่มันบอกว่า SQLite3::SQLException: no such column: vacancies: SELECT "projects".* FROM "projects" INNER JOIN "vacancies" ON "vacancies"."project_id" = "projects"."id" WHERE ("projects"."deleted_at" IS NULL) AND (count(vacancies) > 0).

8
วิธีตรวจสอบว่าเพิ่งสร้างหรืออัปเดตเรกคอร์ดใน after_save
#new_record? ฟังก์ชันกำหนดว่าบันทึกถูกบันทึกหรือไม่ แต่มันมักจะเป็นเท็จในafter_saveเบ็ด มีวิธีตรวจสอบว่าเรกคอร์ดที่สร้างขึ้นใหม่หรือบันทึกเก่าจากการอัปเดตหรือไม่? ฉันหวังว่าจะไม่ใช้การโทรกลับอื่นเช่นbefore_createเพื่อตั้งค่าสถานะในแบบจำลองหรือต้องการแบบสอบถามอื่นในฐานข้อมูล คำแนะนำใด ๆ ที่ชื่นชม แก้ไข: จำเป็นต้องตรวจสอบในafter_savehook และสำหรับกรณีการใช้งานเฉพาะของฉันไม่มีupdated_atหรือupdated_onประทับเวลา

5
Rails กรองอาร์เรย์ของวัตถุตามค่าแอตทริบิวต์
ดังนั้นฉันจึงทำการค้นหาไปยังฐานข้อมูลและฉันมีอาร์เรย์ของวัตถุทั้งหมด: @attachments = Job.find(1).attachments ตอนนี้ฉันมีอาร์เรย์ของออบเจ็กต์ฉันไม่ต้องการดำเนินการสืบค้นฐานข้อมูลอื่น แต่ฉันต้องการกรองอาร์เรย์ตามAttachmentวัตถุfile_typeเพื่อที่ฉันจะได้มีรายการattachmentsที่ประเภทไฟล์อยู่'logo'และจากนั้นรายการอื่นattachmentsที่ ประเภทไฟล์คือ'image' สิ่งนี้: @logos = @attachments.where("file_type = ?", 'logo') @images = @attachments.where("file_type = ?", 'image') แต่อยู่ในหน่วยความจำแทนที่จะเป็นแบบสอบถามฐานข้อมูล

8
ค้นหา () ด้วยศูนย์เมื่อไม่มีระเบียน
ในโปรแกรมรางปัจจุบันของฉันเมื่อฉันใช้สิ่งต่างๆเช่น user = User.find(10) เมื่อไม่มีผู้ใช้ที่มี ID = 10 ฉันจะมีข้อยกเว้นเช่น: ActiveRecord::RecordNotFound: Couldn't find User with ID=10 ฉันสามารถรับศูนย์แทนการเพิ่มข้อยกเว้นได้หรือไม่เมื่อฉันทำบางสิ่งเช่น: unless user = Challenge.find(10) puts "some error msg" end ฉันแค่อยากได้ศูนย์เมื่อไม่มีบันทึกและฉันไม่ต้องการใช้ start / rescue ขอบคุณ

3
วิธีเพิ่มเรกคอร์ดใน has_many: ผ่านการเชื่อมโยงในราง
class Agents << ActiveRecord::Base belongs_to :customer belongs_to :house end class Customer << ActiveRecord::Base has_many :agents has_many :houses, through: :agents end class House << ActiveRecord::Base has_many :agents has_many :customers, through: :agents end ฉันจะเพิ่มAgentsรุ่นสำหรับCustomer? วิธีนี้เป็นวิธีที่ดีที่สุดหรือไม่? Customer.find(1).agents.create(customer_id: 1, house_id: 1) ข้างต้นใช้งานได้ดีจากคอนโซลอย่างไรก็ตามฉันไม่รู้ว่าจะบรรลุสิ่งนี้ในแอปพลิเคชันจริงได้อย่างไร ลองนึกภาพว่ามีการกรอกแบบฟอร์มสำหรับลูกค้าที่ใช้house_idเป็นข้อมูลป้อนข้อมูล จากนั้นฉันจะทำสิ่งต่อไปนี้ในคอนโทรลเลอร์ของฉันหรือไม่? def create @customer = Customer.new(params[:customer]) @customer.agents.create(customer_id: @customer.id, house_id: params[:house_id]) @customer.save …

4
วิธีรับค่าเดิมของแอตทริบิวต์ใน Rails
มีวิธีรับค่าดั้งเดิมที่แอตทริบิวต์ ActiveRecord (= ค่าที่โหลดจากฐานข้อมูล) หรือไม่ ฉันต้องการสิ่งนี้ในผู้สังเกตการณ์ before_save object do_something_with object.original_name end ภารกิจคือการลบวัตถุออกจากตารางแฮช (ในความเป็นจริงย้ายไปยังคีย์อื่นในตาราง) เมื่อทำการอัปเดต

4
วิธีใช้ has_many: ผ่านความสัมพันธ์กับ Mongoid และ Mongodb?
การใช้ตัวอย่างที่แก้ไขนี้จากคู่มือ Railsโมเดลหนึ่งการเชื่อมโยง "has_many: through" เชิงสัมพันธ์โดยใช้ mongoid เป็นอย่างไร ความท้าทายคือ mongoid ไม่รองรับ has_many: through เหมือนที่ ActiveRecord ทำ # doctor checking out patient class Physician < ActiveRecord::Base has_many :appointments has_many :patients, :through => :appointments has_many :meeting_notes, :through => :appointments end # notes taken during the appointment class MeetingNote < ActiveRecord::Base has_many :appointments has_many …

1
วิธีใช้ดัชนีเฉพาะบนสองคอลัมน์ในราง
ฉันมีตารางและฉันกำลังพยายามเพิ่มดัชนีเฉพาะในสองคอลัมน์ คอลัมน์เหล่านั้นจะถูกจัดทำดัชนีด้วย ดังนั้นคำถามของฉันคือถ้าฉันสามารถลบดัชนีที่เป็นเพียงคอลัมน์เดียวหรือถ้าฉันต้องใช้ดัชนีทั้งสาม: add_index "subscriptions", ["user_id"] add_index "subscriptions", ["content_id"] add_index "subscriptions", ["user_id"], ["content_id"], :unique => true

2
คำเตือนการเลิกใช้งานเมื่อใช้ has_many: ถึง: uniq ใน Rails 4
Rails 4 ได้แนะนำคำเตือนการเลิกใช้งานเมื่อใช้: uniq => true กับ has_many: through ตัวอย่างเช่น: has_many :donors, :through => :donations, :uniq => true ให้คำเตือนต่อไปนี้: DEPRECATION WARNING: The following options in your Goal.has_many :donors declaration are deprecated: :uniq. Please use a scope block instead. For example, the following: has_many :spam_comments, conditions: { spam: true }, class_name: …

7
Rails สร้างหรืออัพเดตเวทย์มนตร์?
ฉันมีคลาสที่เรียกCachedObjectว่าเก็บอ็อบเจ็กต์อนุกรมทั่วไปที่จัดทำดัชนีด้วยคีย์ ฉันต้องการให้คลาสนี้ใช้create_or_updateวิธีการ หากพบวัตถุจะทำการอัปเดตมิฉะนั้นจะสร้างวัตถุใหม่ มีวิธีทำใน Rails หรือไม่หรือต้องเขียน method ของตัวเอง?

1
Rails ติดตามได้อย่างไรว่าการย้ายข้อมูลใดที่รันสำหรับฐานข้อมูล
อ้างอิงจาก Rails doc: http://guides.rubyonrails.org/migrations.html "แทร็ก Active Record ที่มีการเรียกใช้การย้ายข้อมูลไปแล้วดังนั้นสิ่งที่คุณต้องทำคืออัปเดตแหล่งที่มาของคุณและเรียกใช้ rake db: migrate" ActiveRecord ทำสิ่งนี้ได้อย่างไร? Active Record เก็บข้อมูลไว้ที่ไหน ฉันสงสัยว่าสิ่งนี้อาจถูกเก็บไว้ในฐานข้อมูลเอง? ในโต๊ะที่ไหนสักแห่ง บนเครื่องพัฒนาของฉันฉันรันการย้ายข้อมูลทั้งหมด จากนั้นฉันคัดลอกฐานข้อมูลการผลิตโดยใช้ mysqldump จากนั้นฉันก็รัน "rake db: migrate: status" มันแสดงการย้ายข้อมูลที่ต้องรันบนฐานข้อมูลการผลิตอย่างถูกต้อง ฉันเคยคิดว่า ActiveRecord ติดตามการย้ายข้อมูลครั้งล่าสุดโดยใช้การประทับเวลา แต่ฉันคิดว่านี่ไม่เป็นความจริงเนื่องจาก ActiveRecord เรียกใช้การย้ายข้อมูล "เก่ากว่า" ที่รวมเข้ากับโค้ดสาขาอื่น คนที่มีความรู้ภายในเกี่ยวกับเรื่องนี้อย่างละเอียดได้หรือไม่? ขอบคุณ

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