ما هي أفضل طريقة لإعداد طاولاتي وعلاقاتي لحالة الاستخدام هذه؟

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

سؤال

1) يمكن للمستخدم أن يكون لديه العديد من الأسباب ويمكن أن ينتمي السبب إلى العديد من المستخدمين.

2) يمكن للمستخدم أن يكون لديه العديد من الحملات ويمكن أن تنتمي الحملات إلى العديد من المستخدمين. تنتمي الحملات إلى سبب واحد.

أريد أن أكون قادرًا على تعيين أسباب أو حملات لمستخدم معين ، بشكل فردي. لذلك يمكن تعيين المستخدم حملة محددة. أو يمكن تعيين المستخدم سببًا ويجب أن ترتبط جميع حملات ذلك السبب بالمستخدم.

هل هذا ممكن؟ وهل يمكنني إعداده حتى يمكن تبسيط العلاقات مثل:

user.causes = كل الأسباب التي تنتمي إلى مستخدم

user.campaigns = جميع الحملات التي تنتمي إلى المستخدم سواء من خلال جمعية السبب أو جمعية الحملة

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

المحلول

أعتقد أنه يجب عليك استخدام ما يلي:

class User < ActiveRecord::Base
   has_and_belongs_to_many :causes
   has_and_belongs_to_many :campaigns
end

class Cause < ActiveRecord::Base
   has_and_belongs_to_many :users
   has_many :campaigns
end

class Campaign < ActiveRecord::Base
   has_and_belongs_to_many :users
   belongs_to :cause
end

بهذه الطريقة يمكنك استخدامها

User.causes
User.campaigns

Cause.campaing
Cause.users

Campaign.users
Campaign.cause

يمكنك القراءة هنا حول has_and_belongs_to_many صلة، هنا حول has_one و هنا حول belongs_to.

اسمحوا لي أن أعرف إذا كان هذا ما تريد:

يحرر:

"ما زلت بحاجة إلى المستخدم.

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

def all_campaigns
   self.campaigns + self.causes.collect{ |c| c.campaigns }
end

نصائح أخرى

هذا يجب أن يعمل.

class User < ActiveRecord::Base
  has_many :causes, :through => :cause_users
  has_many :campaigns, :through => :campaign_users
  # other model stuff

class Cause < ActiveRecord::Base
  has_many :users, :through => :cause_users
  has-many :campaigns
  # other model stuff

class Campaign < ActiveRecord::Base
  belongs_to :cause
  has_many :users, :through => :campaign_users
  # other model stuff

class CampaignUser < ActiveRecord::Base
  belongs_to :campaign
  belongs_to :user
  # other model stuff

class CauseUser < ActiveRecord::Base
  belongs_to :cause
  belongs_to :user
  # other model stuff

HAS_MANY: من خلال تتطلب أن تقوم بإنشاء نموذج جديد لكل من هذه الوصلات: COMMANT_USERS و CASE_USERS ، كما هو موضح ولكنه يوفر وظائف أكثر في وقت لاحق من HAS_AND_BELONGS_TO_MANY.

أود أن أقترح أيضًا استخدام أسماء أفضل من: Campail_users و: cause_users وبالتالي فإن العلاقة أكثر أهمية.

يمكنك صنع: HAS_MANY: من خلال الارتباطات بين المستخدمين والحملات باستخدام نموذج JOIN ، وأيضًا بين المستخدمين والأسباب باستخدام نموذج JOIN آخر. يمكنك عمل: HAS_MANY: جمعية الحملات في نموذج الأسباب ، وضع: ينتمي إلى: السبب في نموذج الحملة.

لكنك لن تتمكن من جلب جميع حملات المستخدمين أو أسبابها بواسطة user.campaigns.orders أو user.order.campaigns. يجب عليك إجراء تكرار على مجموعة user.campaigns أو المستخدم. أو حتى إجراء استعلام مخصص SQL ، باستخدام الوصلات والشروط لتصفية المعلومات في الوصلات.

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