1

올바른 방법을 나는이 개 그것의 서브 클래스를 만들려면 :모델 서브 클래스를 구현 - 내가 <code>Event</code> 모델이

uid  :string 
title  :string 
starts_at :datetime 
ends_at :datetime 

FixedEvent 이벤트와 상속 : FixedEventTasksEvent

이벤트 모델은 이러한 특성을가

all_day :boolean 

TasksEvent는 Event에서 상속 받고 다음과 같은 특성을 갖습니다.

(어커런스 속성은 태스크가 말할 수있는 특별한 방법입니다.이 태스크를 두 번/세 번/x 번 수행하십시오. 발생은 작업의 발생을 나타냅니다 (예 : 사용자가 작업을 수행하는 두 번째 시간 임).

어제 하루 종일 단일 테이블 상속 및 다형성 연관성에 대한 정보를 읽었으며 아직 100 % 확실하지 않습니다. 이것을 레일스에서 ​​구현하는 올바른 방법.

단일 테이블 상속으로 인해 uid, title, starts_at, ends_at, all_day, task_id, occurence, type이있는 하나의 테이블을 갖게되어 데이터베이스에 많은 null 값이 남습니다. 레일스가 모든 이벤트 쿼리에 대해 더 많은 (null) 데이터를 가져 오므로 서버 응답 속도가 느려 집니까?

다른 한편, Polymorphic Associations은 모델에 하위 기능을 추가하는 대신 추가 기능을 추가하는 것처럼 보입니다.

fixed_events: 
id 
all_day 
created_at 
updated_at 

tasks_events: 
id 
task_id 
occurrence 
created_at 
updated_at 

이 동작 속도가 느린 같은 서버 응답을 만들 것

events: 
id, uid, title, starts_at, ends_at, 
created_at, updated_at, 
event_type_id, event_type_type 

(무언가가 당신의 마음에 오는 경우 유형에 대한 더 나은 이름을 제안) : 또한 그것은 dB 더 테이블 (이 경우 세)을 만듭니다 레일스는 모든 FixedEvent/TasksEvent 속성을 가져올 때마다 여러 개의 db 조인을 수행해야합니까?

또한 STI 및/또는 다형성 연관을 사용하여 새 ActiveRecord 객체를 만들 수 있습니까?

= f.fields_for :event do |event| 
    .field 
    = event.label :title 
    = event.text_field :title 
    .field 
    = event.label :starts_at 
    = event.datetime_select :starts_at 
    .field 
    = event.label :ends_at 
    = event.datetime_select :ends_at 
    .field 
    = event.label :description 
    = event.text_field :description 
    .field 
    = event.label :uid 
    = event.text_field :uid 

내가 FixedEventTasksEvent에서이 두 가지를 추가했다 그것은 일 : form_for에서 다음

def new 
    @fixed_event = FixedEvent.new 
    @fixed_event.build_event 

    respond_to :html 
end 

그리고 : 나는 다형성 협회 같은 것을 시도

attr_accessible :event_attributes 
accepts_nested_attributes_for :event 

이것을 수행하는 올바른 방법입니까, 아니면 STI가 더 좋습니까 (또는 다른 솔루션입니까?)?

답변

1

STI는 간단하기 때문에 연결로드보다 훨씬 빠르다. Null 값을로드하는 것은 성능에 대해 걱정할 필요가 없습니다. 반면에 조인 (또는 열망하는로드)은 이벤트 테이블에 수만 개의 항목이 포함되면 성능 문제가 발생할 가능성이 훨씬 큽니다.

모든 열을 선택하면 지금까지 당신을 위해 문제가되면, 당신은 언제나 모든 컬럼의 서브 세트를 선택할 수 있습니다 : 그것은 당신처럼 보인다

FixedEvent.select('foo, bar').all 

아직 내가 필요 없어 STI 이해를 여기서 어떻게하는지 가르쳐주세요. 간단합니다. 실제로 "type"열과 Event 클래스로 "events"테이블을 만든 다음 서브 클래 싱합니다.