비즈니스 로직은 다음과 같습니다. 사용자는 조인 테이블을 통해 보트에 있으며,이 모델을 티켓이라고 부릅니다. 그러나 사용자 인스턴스가 보트에있는 다른 사용자를 확인하려고 할 때 해당 사용자에게 보트의 모든 사용자 또는 보트의 특정 사용자를 볼 수 있는지 묻는 조건이 있습니다. 사용자가 모든 사람을 볼 수 있다면 정상적인 거래가 가능합니다. some_user.boats.first.users
은 해당 보트 티켓을 가진 모든 사용자를 반환합니다. 그러나 일부 사용자의 경우 보트에있는 유일한 사람들 (사람들이 염려하는 한)은 사람들입니다. 식당을 예로 들어 봅시다. 따라서 사용자의 티켓이 acts_as_taggable
스타일 시스템을 사용하여 '다이닝 룸'으로 '태그 지정'된 경우 some_user.boats.first.users
에서 반환 된 유일한 사용자는 '다이닝 룸'이라는 티켓이있는 사용자 여야합니다.싱글 톤 클래스를 사용하여 ActiveRecord 연결을 동적으로 덮어 쓰기/추가하기
레코드 용으로, 나는 getgo에서 정신 나간 것을 디자인하려고하지 않습니다.이 임의 그룹화를 (주로) 존재하는 시스템에 넣으려고합니다. 생성 할 때, SQL을 생성까지 모든 방법을 얻을 수
singleton = class << a_user_instance ; self ; end
singleton.class_eval(<<-code
has_many :tickets, :include => :tags, :conditions => ['tags.id in (?)', [#{tag_ids.to_s(:db)}]]
code
)
:하지만,
class User
has_many :tickets
has_many :boats, :through => :tickets
end
class Ticket
belongs_to :user
belongs_to :boat
end
class Boat
has_many :tickets
has_many :users, :through => :tickets
end
처음에는 내가 조건부 같은 가상 클래스를 수정할 수 있다고 생각 : 는 그래서 우리는있어 그것은 SQL이 끝나는 생성
LEFT OUTER JOIN "tags" ON ("tags"."id" = "taggings"."tag_id") WHERE ("tickets"._id = 1069416589 AND (tags.id in (5001,4502)))
나는 액티브 코드 주위에 파고 시도했지만, 난 아무데도 찾을 w이 없습니다 위의 SQL에서 밑줄로 'id'접두어를 붙입니다. ActiveRecord 클래스가로드 될 때 연관이로드된다는 것을 알고 있으며, 싱글 톤 클래스와 동일한 것으로 가정합니다. shrug.
는 또한 같은 alias_method_chain
사용 :
singleton = class << a_user_instance ; self ; end
singleton.class_eval(<<-code
def tickets_with_tag_filtering
tags = Tag.find(etc, etc)
tickets_without_tag_filtering.scoped(:include => :tags, :conditions => {:'tags.id' => tags})
end
alias_method_chain :tickets, :tag_filtering
code
)
를하지만 그 방법은 원하는 티켓을 생산하면서 그 티켓은 클래스가 아닌 가상 클래스의 조건을 사용에 어떤 조인. some_user.boats.first.users
은 모든 사용자를 반환합니다.
특히이 방법으로 잘못된 트리를 짖고 있다면 모든 유형의 주석이 인정 될 것입니다. 감사!
당신은 절대적으로 옳습니다. 저는 이것에 대해 매우 비슷한 것을 구현하고, 기존 코드를 편집하며, 가슴 전체를 무한한 힘으로 피하지 않을 것입니다. 또한 싱글 톤 클래스의 밑줄 문제를 추적했습니다. ActiveRecord 2.3 reflection.rb의 241 행입니다. 그 라인 인 경우 : 는 'active_record.class_name.foreign_key' 대신 'active_record.name.foreign_key' 모든 것이 잘 작동합니다. 안녕하세요, 귀하의 모든 도움과 조언에 감사드립니다. 정말 감사. – narsk