باستخدام أكتيفيريكورد belongs_to مع مفتاحين
-
05-07-2019 - |
سؤال
ولدي نموذجين أكتيفيريكورد مع جمعية hasMany / belongsTo:
class User < ActiveRecord::Base
has_many :letters
end
class Letter < ActiveRecord::Base
belongs_to :user
end
ونموذج العضو لديه سمة revision_number، والتي أود أن نطاق الجمعية belongs_to، لذلك يرتبط الرسالة إلى مستخدم من قبل كل من user.id وuser.revision_number.
وحاولت استخدام: مفتاح الظروف كما هو موثق في مستندات API:
class Letter < ActiveRecord::Base
belongs_to :user, :conditions => "revision_number = #{client_revision}"
end
ولكن هذه المحاولات للاتصال العميل مراجعة على الطبقة رسالة، لا مثيل رسالة. يمكن لأي شخص لي نقطة في الاتجاه الصحيح لتحديد النطاق جمعية belongs_to بشكل صحيح؟
وأنا باستخدام الأعمال كما هو وrevisable المساعد لنسخة المستخدم نموذج.
المحلول 2
وبرزت أخيرا ما أنا في حاجة كان شيئا مثل مفاتيح المركبة، التي القضبان أكتيفيريكورد لا يدعم. وكان الحل (حاليا على الأقل) لكتابة يمكنهم الدخول العميل مخصصة على رسالة لدعم مفاتيح المركبة (الهوية وrevision_number):
class Letter < ActiveRecord::Base
def client
Client.find_by_id(self.client_id).try(:find_revision, self.client_revision)
end
def client=(c)
self.client_id = c.id
self.client_revision = c.revision_number
end
end
class Client < ActiveRecord::Base
acts_as_revisable
has_many :letters
end
مع هذا الإعداد، فإن العميل # 1.letters استرداد مجموعة من الرسائل على حد سواء، ولكن رسالة # 2.client استرداد العميل # 1r2، بينما رسالة # 2.client سيتم استرداد العميل # 1R4:
Client id: 1 1 1 1 1 1
rev_number: 1 2 3 4 5 6
Letter id: 1 2
client_id: 1 1
client_revision: 2 5
لا يزال غير متأكد ما إذا كان هذا هو أفضل نهج لهذه المشكلة، ولكن يبدو أن العمل في الوقت الراهن.
نصائح أخرى
وأواجه صعوبة في فهم لماذا كنت تريد أن نطاق belongs_to
في هذا السبيل. تصحيح لي إذا كنت مخطئا، ولكن قد يكون من الأفضل أن تفعل شيئا من هذا القبيل. وأنا على افتراض كنت تريد نوعا من نظام التحكم في الإصدار:
class User < ActiveRecord::Base
has_many :letters
end
class Letter < ActiveRecord::Base
has_many :revisions, :class_name => "LetterVersion"
belongs_to :current, :class_name => "LetterVersion"
end
class LetterVersion < ActiveRecord::Base
belongs_to :letter
end