문제

객체가 다른 클래스의 정확한 n 객체와 관련된 관계를 모델링하는 가장 좋은 방법이 궁금했습니다. has_one 관계를 n의 특정 값으로 확장하고 싶습니다.

예를 들어, TopfiveMovieslist는 사용자에게 속하며 정확히 5 개의 영화가 있습니다. 기본 SQL 테이블에는 movie_id_1, movie_id_2, ... movie_id_5와 같은 필드가 있다고 생각합니다.

나는 Has_many 관계를 수행하고 모델 수준에서 어린이 수를 제한 할 수 있다는 것을 알고 있지만, 중개자 테이블이 없을 것입니다.

도움이 되었습니까?

해결책

내 첫 번째 본능은 가입 테이블을 사용하는 것이지만 바람직하지 않은 경우 User.movie[1-5]_id 열은 청구서에 맞습니다. (제 생각에는 movie1_id Rails 컨벤션에 더 잘 맞습니다 movie_id_1.)

이 레일과 ActiveRecord에 태그를 지정 했으므로 내 대답에 완전히 테스트되지 않은 다소 잘못된 모델 코드를 추가하겠습니다. :)

class User < ActiveRecord::Base
  TOP_N_MOVIES = 5
  (1..TOP_N_MOVIES).each { |n|  belongs_to "movie#{n}".to_sym, :class_name => Movie }
end

이 라인을 매크로 스타일 방법으로 감을 수 있지만 응용 프로그램의 일반적인 패턴이 아니라면 코드를 읽기 어렵게 만들 수 있습니다.

사용자 목록에 복제 영화가 없도록 검증을 추가 할 수도 있습니다.

영화 수업을 사용자와 다시 연결하는 것은 비슷합니다.

class Movie < ActiveRecord::Base

  (1..User::TOP_N_MOVIES).each do |n| 
    has_many "users_list_as_top_#{n}".to_sym, :class_name => User, :foreign_key => "movie#{n}_id"
  end

  def users_list_as_top_anything
    ary = []
    (1..User::TOP_N_MOVIES).each {|n| ary += self.send("users_list_as_top_#{n}") }
    return ary
  end

end

(물론 users_list_as_top_anything 아마도 명시 적 SQL로 더 잘 작성 될 것입니다. 나는 오늘 게으르다.)

다른 팁

Join 모델을 통해이 모델을 구현하는 것이 여기에서 가장 좋은 방법이라고 생각합니다. 그것은 허용합니다 List 목록 로직 및 the에 대해 걱정하는 모델 Movie 영화 논리에 대해 걱정하는 모델. 당신은 a를 만들 수 있습니다 Nomination (이름은 가장 크지는 않지만 내가 의미하는 바를 알고 있습니다) 영화와 목록 간의 관계를 처리하려는 모델이며, 5라는 제한이 있으면 후보를 철회 할 수 있습니다.

이 접근법이 더 좋다고 생각하는 몇 가지 이유가 있습니다.

먼저, 당신이 두 가지 방식으로 관계를 가로 지르고 싶다고 가정합니다.movie.lists 그리고 list.movies), 5 열 접근법은 훨씬 더 지저분해질 것입니다.

ActiveRecord가 지원하는 것이 훨씬 나을 것입니다. has n 관계는 그렇지 않으므로 그 프레임 워크와 싸울 것입니다. 또한, has n 이 상황에서 관계는 나에게 약간 부서지기 쉬운 것 같습니다. 나는 그런 종류의 구현이 ActiveRecord에서 벗어난 것을 보지 못했지만, 나는 그것이 일어나는 것을보고 정말로 관심이 있습니다. :)

나는 당신이 "모델"보다는 "구현"을 의미한다고 가정합니까? Modeling은 UML에서 매우 쉽습니다.

그러나 has_one이라고 말하면 has_5로 갈 때 어려움이옵니다. 간단한 스칼라 값이라면 Has_one은 아마도 부모 엔티티의 속성 일 것입니다. Has_5는 아마도 UML의 "관계"관계를 통해 서로 관련된 2 개의 엔티티 일 것입니다.

대답해야 할 주요 질문은 아마도 "항상 '톱 5'가 될 것이라고 보장 할 수 있습니까?"입니다. 그렇다면 언급 한대로 열로 모델링하십시오. 그렇지 않으면 다른 엔티티로 모델링하십시오.

또 다른 질문은 아마도 "Refactor가 얼마나 쉬운가?"일 것입니다. 간단한 경우, 5 개의 열로 시작하고 변경되면 개별 엔티티로 리팩터로 시작하십시오.

평소와 같이 "최고"는 비즈니스 및 기술 환경에 따라 다릅니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top