كيفية تحديد مكان المعرف في Array Rails ActiveRecord دون استثناء

StackOverflow https://stackoverflow.com/questions/1441791

سؤال

عندما يكون لدي مجموعة من المعرفات، مثل

ids = [2,3,5]

وأنا أؤدي

Comment.find(ids)

كل شيء يعمل بشكل جيد.ولكن عندما يكون هناك معرف غير موجود، أحصل على استثناء.يحدث هذا بشكل عام عندما أحصل على قائمة بالمعرفات التي تتطابق مع بعض عوامل التصفية ثم أفعل شيئًا مثل ذلك

current_user.comments.find(ids)

قد يكون لدي هذه المرة معرف تعليق صالح، ولكنه لا ينتمي إلى مستخدم معين، لذلك لم يتم العثور عليه وأحصل على استثناء.

لقد حاولت find(:all, ids), ، ولكنه يقوم بإرجاع كافة السجلات.

الطريقة الوحيدة التي يمكنني القيام بها الآن هي

current_user.comments.select { |c| ids.include?(c.id) }

ولكن هذا يبدو لي وكأنه حل غير فعال للغاية.

هل هناك طريقة أفضل للاختيار معرف في صفيف دون الحصول على استثناء على سجل غير موجود؟

هل كانت مفيدة؟

المحلول

إذا كان مجرد تجنب استثناء كنت قلقا، والأسرة "find_all_by .." وظائف تعمل دون رمي الاستثناءات.

Comment.find_all_by_id([2, 3, 5])

وستعمل حتى إذا كان بعض من هويات لا وجود لها. هذا وتعمل في

user.comments.find_all_by_id(potentially_nonexistent_ids)

والحال كذلك.

تحديث: القضبان 4

Comment.where(id: [2, 3, 5])

نصائح أخرى

تحديث:هذه الإجابة أكثر صلة بـ Rails 4.x

افعل هذا:

current_user.comments.where(:id=>[123,"456","Michael Jackson"])

الجانب الأقوى من هذا النهج هو أنه يُرجع ملف Relation الكائن، والذي يمكنك الانضمام إليه أكثر .where شروط، .limit الجمل وما إلى ذلك، وهو أمر مفيد للغاية.كما يسمح أيضًا بمعرفات غير موجودة دون طرح استثناءات.

سيكون بناء جملة روبي الأحدث:

current_user.comments.where(id: [123, "456", "Michael Jackson"])

إذا كنت بحاجة إلى المزيد من السيطرة (ربما تحتاج إلى القول اسم الجدول) يمكنك أيضا القيام بما يلي:

Model.joins(:another_model_table_name)
  .where('another_model_table_name.id IN (?)', your_id_array)

والآن .find وإهمال أساليب .find_by_id في القضبان 4. بدلا من ذلك يمكننا استخدام أدناه:

Comment.where(id: [2, 3, 5])

وانها ستعمل حتى إذا كان بعض من هويات لا وجود لها. هذا وتعمل في

user.comments.where(id: avoided_ids_array)

وأيضا لاستبعاد البائع

Comment.where.not(id: [2, 3, 5])

لتجنب استثناءات قتل التطبيق الخاص بك يجب عليك ان تصطاد تلك الاستثناءات والتعامل معهم بالطريقة التي ترغب في ذلك، تحديد السلوك بالنسبة لك التطبيق على تلك الحالات حيث لم يتم العثور على الهوية.

begin
  current_user.comments.find(ids)
rescue
  #do something in case of exception found
end

إليك مزيد من المعلومات حول الاستثناءات في روبي.

ويمكنك أيضا استخدامه في named_scope إذا كنت تريد أن تضع الشروط هناك آخرون

وعلى سبيل المثال تشمل بعض نموذج آخر:

<اقتباس فقرة>   

وnamed_scope "get_by_ids، امدا {| هويات | {: وتشمل => [التعليقات]،: ظروف => [ "comments.id IN (؟)"، هويات]}}

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