質問

hasMany / belongsToアソシエーションを持つ2つのActiveRecordモデルがあります:

class User < ActiveRecord::Base
  has_many :letters
end

class Letter < ActiveRecord::Base
  belongs_to :user
end

Userモデルにはrevision_number属性があり、belongs_toアソシエーションのスコープにしたいので、レターはuser.idとuser.revision_numberの両方によってユーザーに関連付けられます。

APIドキュメントに記載されている:conditionsキーを使用してみました:

class Letter < ActiveRecord::Base
  belongs_to :user, :conditions => "revision_number = #{client_revision}"
end

ただし、これはLetterのインスタンスではなく、Letterクラスでclient-revisionを呼び出そうとします。誰でも、belongs_toアソシエーションを正しくスコープするための正しい方向に私を向けることができますか?

acts-as-revisable プラグインを使用してユーザーをバージョン管理していますモデル。

役に立ちましたか?

解決 2

最後に、私が必要とするのは、Rails ActiveRecordがサポートしていない複合キーのようなものであると考えました。解決策(少なくとも今のところ)は、複合キー(idおよび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

この設定では、Client#1.lettersは両方の文字の配列を取得しますが、Letter#2.clientはClient#1r2を取得し、Letter#2.clientは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