الاستعلام كبيان شرطي في Ruby/Rails
-
21-12-2019 - |
سؤال
كنت أتابع تطبيق Depot من Agile Web Development باستخدام Rails.كانت هناك طريقة حيرتني.اعتقدت أنني فهمت ذلك حتى جربته في irb.إذن هذه هي الطريقة:
def add_product(product_id)
current_item = line_items.find_by_product_id(product_id)
if current_item
current_item.quantity += 1
else
current_item = line_items.build(product_id: product_id)
end
current_item
end
مما فهمته، إنها مجرد طريقة ستعثر أولاً على سجل في LineItems بمعرف منتج لمدخل محدد (دعنا نقول إنه 10).ثم سيتم تخزينه في متغير current_item.يقول الشرط "إذا تم العثور على معرف المنتج، أضف 1 إلى الكمية وإلا قم بإنشاء مثيل جديد لهذا السجل بمعرف المنتج يساوي 10"
هذه هي لقطة وحدة التحكم في Rails الخاصة بي
كما ترى، لم يتم العثور على معرف المنتج رقم 10 في LineItem.لكن في حالتي، فإن هذا يتعارض مع كل ما أؤمن به حتى الآن.هل يمكن لأحد أن يلقي الضوء على هذا؟
المحلول
يشبه line
هي مجموعة فارغة (ActiveRecord::Relation على وجه الدقة) ولذا فهي شيء في روبي وليست صفرًا.ولهذا السبب يعود صحيحًا عند الاتصال if line
والتنفيذ puts 'I'm true and happy'
.السبب في أنها ActiveRecord::Relation هو أنك تستخدم أين استفسار.
في تطبيق Depot يقومون بالاستعلام عن طريق الاتصال line_items.find_by_product_id(product_id)
وهو مختلف.يجد السجل الأول المطابق للشرط.
تحقق من أدلة Rails هنا لمزيد من المعلومات - http://guides.rubyonrails.org/active_record_querying.html (المادة 15)
ملاحظة: يبدو أن هذا النوع من الاستعلام قد تم إهماله في Rails 4، لذا لست متأكدًا من إصدار Agile Web Development with Rails الذي تبحث عنه.