سؤال

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

البيانات

  • الحساب (has_many :sites)
  • الموقع (habtm :users, تنتمي_to :account)
  • المستخدم (هابتم :مواقع)

تجاهل أنهم هابتم أو أي شيء آخر، يمكنني أن أجعلهم هابتم أو لديهم الكثير :من خلال.

أريد أن أكون قادرا على القيام به

@user.accounts

أو

@account.users

ثم بالطبع يجب أن أكون قادرًا على القيام بذلك

@user.accounts < @some_other_account

ثم اطلب من @user.sites تضمين كافة المواقع من @some_other_account.

لقد عبثت بـ habtm و has_many :through ولكن لا يمكنني جعله يفعل ما أريد.

أحتاج في الأساس إلى إنهاء استعلام مثل هذا (منسوخ من phpmyadmin.تم اختباره ويعمل):

SELECT accounts.* 
FROM accounts
INNER JOIN sites ON sites.account_id = accounts.id
INNER JOIN user_sites ON sites.id = user_sites.site_id
WHERE user_sites.user_id = 2

هل يمكنني فعل هذا؟هل هي فكرة جيدة أن يكون لديك هذا الانضمام المزدوج؟أفترض أنه سيكون من الأفضل أن يكون لدى المستخدمين ارتباط بالحسابات في البداية، ثم يقلقون بشأن الحصول على @user.sites بدلاً من ذلك، ولكنه يعمل بشكل أفضل مع العديد من الأشياء الأخرى إذا تم الاحتفاظ به كما هو (المستخدمون <-> المواقع).

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

المحلول

أعتقد أنه من الأفضل إنشاء أساليب مخصصة لهذا بدلاً من محاولة تحويلها إلى جمعية.على سبيل المثال.

# in user.rb
def accounts
  Account.all(:include => {:sites => :users}, :conditions => ["users.id=?", self])
end

def add_account(other_account)
  other_account.sites.each do |site|
    self.sites << site
  end
end

# in account.rb
def users
  User.all(:include => {:sites => :account}, :conditions => ["accounts.id=?", self])
end

لم يتم اختباره، ولكن يجب أن يعمل مع HABTM أو has_many :through منظمة.هناك بعض التحسينات التي يمكنك إجراؤها باستخدام الاستعلام اعتمادًا على الطريقة التي تتبعها.

يومًا ما قد نحصل على دعم متداخل بعمق has_many :through والتي من شأنها التعامل مع بعض من هذا.

نصائح أخرى

قد يكون هذا مفيدًا لك (Rails 2.x)

http://github.com/ianwhite/nested_has_many_through

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