(القضبان) إدارة مسبقات المستخدم مع احتياطي المسبق الرئيسي ...؟
-
20-09-2019 - |
سؤال
أنا أبحث عن آلية لتسهيل تفضيلات المستخدم. أريد أيضًا أن يكون لدي مجموعة من الأجزاء المسبقة "الرئيسية" التي يتم استخدامها إذا لم يكن لدى المستخدم المسجل حاليًا مجموعة مسبق محددة. أرى العديد من الأسئلة المشابهة لهذا ، لكن يبدو أنها تدخل في النظرية بدلاً من مجرد اقتراح حل جودة.
في الأساس ، أبحث عن مدخلات في الإدارة وكذلك التخزين - النماذج ، وحدات التحكم ، وما إلى ذلك. في البداية كنت أفكر ببساطة في الذهاب مع جدول طبيعي مكون من 50 عمودًا (للأداء وما إلى ذلك). ومع ذلك ، أخطط لإضافة تفضيلات مختلفة غير معروفة في المستقبل ، وبصرف النظر عن الأداء ، يمكن أن أتخيل أعمدة متعددة تخرج عن السيطرة. أفكار؟
المحلول
في رأيي ، فإن أفضل طريقة لتحديد واستخدام الافتراضات هي إضافة صف آخر في جدول تفضيلات المستخدم ، وتحميله كمتغير فئة في النموذج الخاص بك. ثم تجاوز الملحقات للعثور على الإعدادات الافتراضية إذا لم يتم العثور على التفضيل. شيء من هذا القبيل:
class UserPreference < ActiveRecord::Base
# load default preferences as a class variable
@@defaults ||= find(1).attributes
# redefine accessors or each column to load default if nil
column_names.each do |column|
method_name = "#{column}_with_default".to_sym
send :define_method, method_name do
value = send("#{column_without_default}")
case value
when nil
@@defaults[column]
else
value
end
end
alias_method_chain column, :default
end
...
end
في الأساس يتم تخزين التفضيلات الافتراضية (المحملة من الصف 1) في النموذج كمتغير فئة. يتم إعادة تعريف جميع الملحقات وجزء من سلسلة طريقة الاسم المستعار بحيث يتم إرجاع الافتراضي إذا كانت القيمة التي تم إرجاعها لا شيء. أردت استخدام || بدلاً من الحالة ، ولكن هذا من شأنه أن يتسبب في مشاكل في حالة قيام المستخدم بتعيين تفضيل منطقي على خطأ.
تحرير: NB لا أعرف طريقة جيدة لتحديث الإعدادات الافتراضية في تطبيق Rails دون إعادة تشغيل الخادم.
نصائح أخرى
إذا لم تكن بحاجة إلى التلاعب أو الفرز حسب التفضيلات الفردية في قاعدة البيانات ، فقد ترغب في استخدام عمود Bitmask (عدد صحيح). في الأساس ، يعد Bitmask مجموعة من مفاتيح التشغيل/الإيقاف الممثلة كرقم ثنائي. على سبيل المثال ، دعنا نقول أن لدينا ثلاثة تفضيلات:
- عرض الاشتراكات
- عرض الألوان
- عرض الأسماء الكاملة
دعنا نقول أن المستخدم لديه 1 و 3 في و 2 قبالة. باستخدام 1S لـ ON و 0S للإيقاف ، فإن Bitmask لهذا هو:
101
(على OFF ON)
يتم تخزين هذا في قاعدة البيانات 5
لان 101
هو 5 في ثنائي. من السهل تخزين Bitmasks في قاعدة البيانات (استخدم عمود عدد صحيح واحد) ويسهل معالجته بمجرد معرفة المشغلين (لدمج تفضيلات المستخدم في الإعدادات الافتراضية للموقع). لدى Ryan Bates برنامج تعليمي رائع حول استخدام Bitmasks في القضبان: جمعية emmbedded. نأمل أن يمنحك هذا المثال الملموس الذي تبحث عنه.