0

지난 달에 레일스를 처음 배우기 시작했습니다. 모델 연관성 설정과 관련하여 질문이 있습니다. 나는 내가 다시 돌아가서 내가 이미 한 일을 바꿔야한다고 생각하는 곳을 찾았다. 다음은 시나리오입니다.레일 연결 옵션

나는 다가오는 이벤트를 나열 할 밴드 신청서를 작성 중입니다.

는 몇 가지 중요한 요소가있다

  • 독특한 이벤트를해야합니다뿐만 아니라 다른 밴드 (즉,이 개 대역이 사용하는 몇 가지와 함께 몇 가지 이벤트를 공유하는 이벤트를
  • 각 밴드를 나열하는 다중 대역이있다 시스템이 같은 장소에서 함께 연주하는 경우)
  • 이벤트의 모든 밴드 (장소, 날짜, 시간, 도시, 주 등)에 공통적 인 특정 정보가 있습니다.
  • 특정 정보가 있습니다 각 이벤트는 사양입니다. 하나의 대역 (즉, 특정 VIP 티켓 구매 URL을 이벤트에 자신의 설명 등)

현재이 그 설정 방법은 다음과 같습니다

class Event < ActiveRecord::Base  
    belongs_to :venue 
    scope :upcoming, where('date >= ?', Date.today) 
end 

class Venue < ActiveRecord::Base 
    has_many :events 
    accepts_nested_attributes_for :events 
end 

난 정말 내가 같이 아직 예술가 모델과 많은 일을하지 않은 시스템에 이벤트를 가져 오는 데 중점을 두었고 하드 코드 된 1 명의 아티스트에 대해 올바르게 나열되었습니다.

기본적으로 사용자는 이벤트 양식을 만들고 날짜와 시간을 선택합니다. 라인은 장소 이름입니다. 개최지 이름 양식은 DB의 장소 이름 + 도시로 자동 완성됩니다. 사용자가 이미 시스템에있는 장소에서 이벤트를 작성하는 경우 이벤트 정보가 중첩 된 속성으로 Venue 모델을 통해 본질적으로 저장됩니다. 장소가 시스템에없는 경우 위치 데이터에 대한 추가 입력 필드가 나타나고 새 장소가 만들어져 해당 이벤트와 연결됩니다.

아티스트에게 이벤트를 공유하고 해당 아티스트에만 해당하는 이벤트에 대한 세부 정보를 유지하는 가장 좋은 방법에 대해 생각해보기 시작하면 다소 힘들어지기 시작합니다. 모든 이벤트를 개별 이벤트로 취급 할 수는 있지만 쉽지는 않지만이 아티스트가이 필드에 해당 이름을 직접 입력하는 것을 제외하고이 아티스트와 함께이 아티스트와 함께 공연한다고 어떻게 말할 수 있을지 확신 할 수 없습니다. 나는 또한 다른 예술가들과 공연 한 아티스트들과 관련하여 ActiveRecords의 마술을 많이 잃는다.

현재 이벤트에는 단 하나의 모델이 있지만 아마도 가장 좋을지도 모른다. 도시, 주 등의 여러 밴드가 공유하지 않는 이벤트 기본 사항에 대한 1 개의 중앙 모델을 유지 한 다음이를 밴드 특정 정보의 보조 event_details 모델에 연결합니다.

여러 모델을 제안 하시겠습니까? 아니면 여러 아티스트가 공유하는 1 개의 주요 이벤트로 다시 연결되는 이벤트 세부 정보 모델을 만드는 것보다 여러 이벤트를 함께 연주하는 밴드를 연결하는 더 나은 방법이 있습니까? 이벤트 테이블에 특정 유형의 고유 한 이벤트 식별자를 만들어서 다른 밴드가 재생중인 동일한 이벤트와 다른 ID로 이벤트를 처리해야합니까? 내가 그걸로 만 볼 수있는 문제는 그때 내 데이터베이스에있는 많은 데이터를 두 배로 늘릴 것입니다 ... 저는 기본적으로 아티스트가 연주하는이 날짜에 이벤트 데이터를 확인하는 동안 수 있기를 원합니다. 이 공연장에서는 다른 밴드와 함께 밴드가 단순히 연주하는 아티스트를 나열하는 "other_artists"열을 만들어야합니다.

죄송합니다. 이해가 되시길 바랍니다 ... 미리 조언 해 주셔서 감사합니다!

답변

0

여기 실제 문제는 아티스트와 이벤트 간의 다 대다 관계를 처리해야한다는 것입니다. 이벤트에는 많은 아티스트가 예약되며 아티스트는 일정에 따라 많은 이벤트를 갖습니다.

하나의 아티스트와 특정 이벤트를 연결하는 "예약"클래스를 만들었습니다. 이 예약은 해당 이벤트에서 연주하는 아티스트에 대한 특별한 요구 사항이나 특별한 준비를하기에 좋은 장소입니다. ActiveRecord의 "has_many : through"관계를 사용하면 매우 직설적이며 데이터를 쿼리하는 방법에 많은 유연성을 제공합니다. 여기에 내가 어떻게 할 것입니다 :

class Event < ActiveRecord::Base  
    belongs_to :venue 
    has_many :artists, :through => :bookings 
    scope :upcoming, where('date >= ?', Date.today) 
end 

class Venue < ActiveRecord::Base 
    has_many :events 
    accepts_nested_attributes_for :events 
end 

class Artist < ActiveRecord::Base 
    has_many :events, :through => :bookings 
end 

class Booking < ActiveRecord::Base 
    belongs_to :artist 
    belongs_to :event 
    attr_accessible :special_requirements, :special_arrangements 
end 

몇 가지 예는 이러한 관계를 통해 데이터를 쿼리에서 얻을 수있는 유연성이 도움이

@venue.events 
@venue.events.where(:id => specific_event.id).first.artists 
@event.artists 
@artist.events 
@event.bookings each do |b| 
    b.artist 
    b.special_requirements 
end 

희망.

+0

네가 맞다고 생각합니다. 도와 주셔서 감사합니다. – brent

+0

예약 모델을 어떻게 업데이트 하시겠습니까? Venue를 통해 중첩 된 속성을 수락하고 일반 이벤트 모델을 업데이트하는 것과 같은 방법으로 업데이트 하시겠습니까? – brent

+0

이벤트를 통해 예약을 관리합니다. 이벤트 컨트롤러에는 연관된보기가있는 "new_booking"및 "update_booking"작업이 있습니다. Event # show보기에서 new_booking 작업에 대한 "새 예약"링크를 제공 할 수 있습니다. new_booking 작업에서 '@booking = @ event.booking.new'를 사용하여 이벤트 예약 관계를 설정합니다. 그런 다음 연관된보기에서 사용자가 아티스트를 선택하고 특별한 요구 사항/준비 사항을 입력 할 수 있습니다. 이벤트는 예약을 위해 중첩 된 속성을 허용해야합니다. –