سؤال

ولدي نموذجين أكتيفيريكورد مع جمعية 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top