سؤال

كنت أتابع تطبيق 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 الخاصة بي

enter image description here

كما ترى، لم يتم العثور على معرف المنتج رقم 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 الذي تبحث عنه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top