2015-03-19 4 views
0

Я работаю в RoR 3..2.11. У меня 4 класса: человек, соглашение, отношения и роль. Моя ситуация выглядит следующим образом:Ruby on Rails - has_many отношения с условием, требующим присоединения

Это в лицо:

has_many :relationships 
has_many :agreements, { 
    through: :relationships 
} 
has_many :current_agreements, { 
    source: :agreements, 
    through: :relationships, 
    conditions: "agreements.start_date <= NOW() AND agreements.end_date >= NOW()" 
} 

Это в отношениях:

belongs_to Role 

Новая роль была добавлена ​​в базу данных («Прошлое»), так что живые соглашения могут быть назначены другому лицу. Сот предыдущего человека по соглашению по-прежнему имеет отношение к соглашению, но больше не должен его подходить под текущие соглашения. Поэтому мне нужно учесть relationships.role.name. Что-то вроде этого:

has_many :current_agreements, { 
    source: :agreements, 
    through: :relationships, 
    conditions: "agreements.start_date <= NOW() AND agreements.end_date >= NOW() AND role.name != 'Past'" 
} 

Проблема здесь довольно четкая, роль не в запросе, так что роль.name терпит неудачу. Есть ли способ присоединиться к таблице ролей с помощью отношенийs.id для ассоциации?

Я думал о переопределении current_agreements как метода вместо этого, но проекту нужно, чтобы это была ассоциация в определенных местах, поэтому я бы скорее просто переопределил ассоциацию, а не перефакторировал все это.

ответ

0

Я думаю, что current_agreements не должен быть ассоциацией. Имеет ли смысл когда-либо говорить

@person.current_agreements << @agreement 

? Если да, будет ли это задавать дату начала и дату окончания, а также соответствующую роль?

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

насчет имени сферы по соглашению, как

#in Agreement 
scope :current, includes(:role).where("agreements.start_date <= NOW() AND agreements.end_date >= NOW() AND role.name != 'Past'") 

Тогда вы можете сказать

@person.agreements.current 
0

Я думаю, что Макс Уильямс прав. Это не должно быть отношением, и мне нравится подход Макса.

Но что-то, что звучит сложно, это то, что вы не хотите реорганизовать. Помните, что одна важная вещь, когда вы разрабатываете программное обеспечение, должна быть подготовлена ​​к изменению. Если сложно рефакторировать, возможно, вам стоит взглянуть на ваши тесты или на то, как ваши классы связаны.

Взгляните на подход Макса, это просто и понятно. И с Ruby/Rails (и, конечно же, с тестами) рефактору может быть приятно, чтобы получить желаемое поведение.

Мне это нравится book. Это могло бы объяснить лучше, чем я, мои предыдущие слова.

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