ما هي أفضل طريقة لإعداد طاولاتي وعلاقاتي لحالة الاستخدام هذه؟
-
02-10-2019 - |
سؤال
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 ، باستخدام الوصلات والشروط لتصفية المعلومات في الوصلات.