ActiveRecord를 사용하면 두 개의 키가있는 _to에 속합니다
-
05-07-2019 - |
문제
Hasmany / Solgsto Association이있는 두 개의 ActiveRecord 모델이 있습니다.
class User < ActiveRecord::Base
has_many :letters
end
class Letter < ActiveRecord::Base
belongs_to :user
end
사용자 모델에는 개정 _number 속성이 있는데,이 속성은 속성 _to 연관성을 범위로 범위를 범하고 있으므로 문자는 user.id와 user.revision_number 모두에 의해 사용자와 연결됩니다.
API 문서에 문서화 된 다음을 사용해 보았습니다.
class Letter < ActiveRecord::Base
belongs_to :user, :conditions => "revision_number = #{client_revision}"
end
그러나 이것은 편지의 사례가 아니라 편지 클래스에서 클라이언트-리베이션을 호출하려고 시도합니다. 누구든지 SOLDS_TO 협회를 올바르게 범위를 범하는 올바른 방향으로 나를 지적 할 수 있습니까?
나는 사용하고있다 방문 가능한 행동 버전으로 플러그인 사용자 모델.
해결책 2
마지막으로 내가 필요로하는 것은 Composite Keys와 같은 것을 알아 냈습니다. 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
이 설정을 사용하면 클라이언트#1. 레터는 두 글자의 배열을 검색하지만 문자#2. 클라이언트는 클라이언트#1R2를 검색하고 문자#2. 클라이언트를 검색합니다. 클라이언트#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