سؤال

أنا أعمل على تطبيق متعدد المستخدمين متعدد المستخدمين حيث يمكن أن يحتوي حساب واحد على مستخدمين N. من المهم للغاية أن يتمكن كل مستخدم فقط من الوصول إلى المعلومات من حسابه. نهجي هو إضافة حساب إلى كل نموذج في DB وأضف عامل تصفية في كل وحدة تحكم لاختيار الكائنات فقط مع الحساب الحالي. سوف أستخدم البرنامج المساعد التفويض.

هل هذا نهج فكرة جيدة؟

ما هي أفضل طريقة لتعيين الحساب دائما لكل كائن تم إنشاؤه دون كتابة

object.account = @current_account

في كل إنشاء إجراء؟ ربما مرشح؟

أيضا لست متأكدا من أفضل طريقة لتنفيذ عامل التصفية للحصول على خيارات الاختيار. أحتاج إلى شيء مثل الحالة العامة: بغض النظر عن ما يظهر آخر في عبارة SQL، فهناك دائما "حيث account_id = xy".

شكرا لمساعدتك!

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

المحلول

هذا مشابه للمستخدم. Has_many: سيناريو رسائل البريد الإلكتروني. أنت لا تريد أن يرى المستخدم رسائل بريد إلكتروني أخرى من خلال تغيير المعرف في عنوان URL، لذلك تقوم بذلك:

@emails = current_user.emails

في حالتك، ربما يمكنك القيام بشيء مثل هذا:

class ApplicationController < ActionController::Base
  def current_account
    @current_account ||= current_user && current_user.account
  end
end

# In an imagined ProjectsController
@projects = current_account.projects
@project = current_account.projects.find(params[:id])

نصائح أخرى

أعرف، أعرف، إذا وافقت على متغيرات الدورة أو المتغيرات المثلية في النموذج الخاص بك، فلن تفهم نمط MVC و "يجب العودة إلى PHP". ولكن لا يزال، قد يكون هذا مفيدا جدا إذا كان لديك - مثلنا - الكثير من وحدات التحكم والإجراءات التي لا ترغب دائما في الكتابة دائما @ current_account.object.do_something (وليس جاف جدا).

الحل الذي وجدته سهل للغاية:

الخطوة 1: أضف Creast_Account إلى Hook.current، لذلك على سبيل المثال

class ApplicationController < ActionController::Base
  before_filter :get_current_account      

  protected
   def get_current_account
     # somehow get the current account, depends on your approach
     Thread.current[:account] = @account
   end
end

الخطوة 2: إضافة طريقة Current_Account إلى جميع النماذج الخاصة بك

   #/lib/ar_current_account.rb
   ActiveRecord::Base.class_eval do
     def self.current_account
      Thread.current[:account]
     end
   end

الخطوة 3: Voill، في النماذج الخاصة بك يمكنك القيام بشيء مثل هذا:

class MyModel < ActiveRecord::Base

  belongs_to :account

  # Set the default values
  def initialize(params = nil) 
    super
      self.account_id ||= current_account.id
  end

end

يمكنك أيضا العمل مع شيء من هذا القبيل من رد الاتصال بالاسترداد قبل active_validation في Active_record ثم قم بإجراء التحقق من الصحة تأكد من تعيين الحساب دائما.

يمكن استخدام نفس النهج إذا كنت ترغب دائما في إضافة current_user إلى كل كائن تم إنشاؤه.

ما رأيك؟

للإجابة على سؤالك الثاني، تحقق من الجديد default_scope ميزة في القضبان 2.3.

أفهم أنك لا تريد أن تهتم بفروع حسابك طوال الوقت. دعنا نكون صادقين، إنه ألم في **.

لإضافة سحر قليلا ولديه هذه النطاق القيام به بسلاسة إلقاء نظرة على GEM التالية

http://gemcutter.org/gems/account_scopper.

أتمنى أن يساعدك هذا،

- سيباستيان جريجيان - زينكون

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