모델 메모가 있습니다. 메모는 매우 유용하며 응용 프로그램 전체에서 많은 용도로 사용됩니다.
우리는 또 다른 모델 사용자를 가지고 있으며 이들은 사용자 1과 사용자 2 사이의 STI 분할입니다.
세 번째 모델 인 Thing이 있습니다. 사용자 소유의 것입니다 ... 좀 더 복잡해 지므로 잠시 그대로 두겠습니다. (마찬가지로 메모 할 수있는 Things와 비슷한 다른 모델도 있습니다.) .
Note.rb
belongs_to :user #This signifies that the user wrote the note
belongs_to :notable, polymorphic: :true #This is what the note is referring to
User.rb
has_many :user_notes, class_name: "Note", foreign_key: "user_id"
#signifies the note was written by the User
User1.rb < User
has_many :notes, as: :notable
#Signifies the note was about the User1
has_many :things
User2.rb < User
has_many :notes, as: :notable
#Signifies the note was about the User2
Thing.rb
belongs_to :user1
has_many :notes, as: :notable
#The note is about the thing
이것들은 일반적으로 자기 참조적일 수는 있지만 그렇지는 않습니다 (나는 나 자신에 대한 메모를 씁니다).
종종 User1s는 User2가 볼 수 있도록 User2s 또는 User2s Things에 대한 메모를 작성합니다.
user_notes의 이름을 바꾸는 데 올바른 경로를 택했다고 생각합니다.
나와 관련이있을 수있는 모든 메모를 수집하는 방법에 어려움을 겪고 있습니다. 즉, 내가 user1라고 가정 해 보겠습니다. 나는 내가 쓴 노트, 다른 사람들이 나에 대해 쓴 노트, 그리고 내 물건에 대해 쓰여진 노트를보고 싶습니다.
그렇게하는 쉬운 방법이 있습니까? 나는 두 가지 점으로 어려움을 겪고 있습니다.
내 물건에 대한 메모를 어떻게 연결할 수 있습니까?
has_many : thing_notes, through : : things, 출처 : : notes
작동하지만 올바른 접근 방법인지 궁금합니다.
또한 나는 그 반대 (일종 유용함)에 관심이 있습니다.이 경우에는 누가 메모를 작성했는지 무시하고 관련 user1이있는 경우이를 반환합니다. 그러나...
delegate :user1, to: :notable
user1이 이미 잠재적 인 notable_type 인 경우 의미가 없습니다.
즉
@user1.notes
나에 대한 메모 만 반환합니다.
@user1.user_notes
내가 쓴 메모를 반환합니다
@user1.thing_notes
내 물건에 대한 메모를 반환합니다
나는 그것들을 함께 병합 할 수 있지만 성가신 중복이 발생할 위험이 있으며 여러 데이터베이스 호출을 수행하고 모두 한 유형일 때 db 순서를 잃는 것은 부끄러운 것 같습니다.
내 모든 메모를 얻을 수있는 확실한 방법이 있나요 ...?
Note.where("(user_id = :user1_id) OR (notable_id = :user1_id AND notable_type = 'User') OR (notable_type = 'Thing' AND notable_id IN (:things))", user1_id: user1.id, things:user1.thing_ids)
추악한 쪽을 만지고 더 추악해질 것입니다 ...
그런 퍼즐을 푸는 것을 좋아하는 사람에게 이해가되는 희망 ...
데이터 정렬의 경우 Rails 5를 사용하는 경우 다음과 같이 원시 SQL을 단순화 할 수 있습니다.
Note.where(user: user1).or(Note.where(notable: user1)).or(Note.where(notable: user1.things))
Rails 5를 사용하지 않는 경우 동일한 기능을 위해이 gem을 포함 할 수 있습니다 : https://github.com/Eric-Guo/where-or
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다