4

У меня есть 4 модели: Artists, Editions, Events & EventItems.Проблемы с цепями в Rails с контекстом

  • Editions имеет много событий
  • Событий имеет много художников через EventItems
  • Editions имеет много Artists через Событие

На художниках у меня есть область применения published

Я деятельный как художников, которые находятся на событии, которое имеет состояние, которое НЕ draft.

scope :published, -> { joins(:events).where("events.state != ?", 'draft').uniq }

Это работает отлично, пока я не начать их цепочки и хотят художников, по крайней мере, на событие, которое published для данного издания.

Edition.first.artists.published

Это работает, за исключением, что он будет также присоединяется events вне текущей редакции и ошибочно публикует художник, если у них есть какое-либо событие, опубликованное (даже если они не являются в данном издании).

Чтобы заставить его работать правильно, я должен был взломать это как так (это ужасно):

scope :published, ->(edition = nil) { 
    if edition.present? 
     joins(:events).where("events.state != ? AND events.edition_id = ?", 'draft', edition.id).uniq 
    else 
     joins(:events).where("events.state != ?", 'draft').uniq 
    end 
    } 

Edition.first.artists.published(Edition.first)

Есть в любом случае, чтобы дать больше контекста сферы включать только те события, в этом издании? Значит, это будет правильно?

Спасибо!

ответ

3

IMHO Проблема связана с вашими ассоциациями и SQL, которые вы генерируете, а не с тем, как вы должны предоставлять контекст для области (передача аргумента совершенно законна).

При звонке Event.artists вы уже присоединились к мероприятиям с has_many :artists, through: :events и тем самым присоединились к events без разбора. Кроме того, вы полагаетесь на события, чтобы определить, являются ли художники активными или нет, что является еще одним источником путаницы, если не нарушение СРП.

Я думаю, что решение исходит из определения правильных ассоциаций:

class Edition 
    has_many :events 
    has_many :artists, through: :events 

    has_many :active_events, -> {where.not(state: "draft")}, class_name: "Events" 
    has_many :active_artists, through: :active_events, 
      class_name: "Artist", 
      source: :artists # => not sure if this option is necessary 
end 

class Events 
    has_many :event_items 
    has_many :artists, through: :event_items 
end 

Event.first.active_artists 

Я не 100% уверен, что о параметрах макросов, но вы получите идею.

Смежные вопросы