Это мой route.rb:
get 'people', to: 'people#index'
get 'people/:person', to: 'people#person'
Это мой контроллер:
def index
@result = People.complicated_stuff
.sum(:amount)
# more queries without .where(person: p)
# more code
end
def person
p = params[:person]
@result = People.complicated_stuff
.where(person: p)
.sum(:amount)
# more queries with .where(person: p)
# more code
end
Я бы хотел, чтобы этот код был более СУХИМ, потому что код тот же,кроме клаузулы.Так что я подумал о том, чтобы объединить два вместе в отдельный метод.Как я могу отменить все предложения where с помощью (Person: p)?Единственное, что я придумал, было:
def my_method(person: nil, select_all: true)
if select_all
p = People.distinct.pluck[:person]
else
p = person
end
@result = People.complicated_stuff
.where(person: p)
.sum(:amount)
end
Но это очень уродливый запрос.
Редактировать
Я только что обнаружил и эту работу, и я думаю, что этодостаточно хорошо для меня: я изменил мой route.rb, чтобы оба перешли к «people # index».И в моем контроллере:
def index
@p = params[:person]
person = @p.nil? ? "" : "people.person = ?"
@result = People.complicated_stuff
.where(person, @p)
.sum(:amount)
end
Я никогда не знал, что это сработало.