#ruby-on-rails #ruby #named-scope #method-chaining
#ruby-on-rails #ruby #named-scope #метод-объединение в цепочку
Вопрос:
Этот код работает нормально, но я смотрю на него и думаю, что он мог бы быть чище. Возможно, есть более идиоматичный способ ruby / rails сделать это? Порядок важен, потому что member_of область должна быть последней, но перед нумерацией страниц (которая возвращает коллекцию, а не область)
Единственное преимущество этого в том, что довольно ясно, что происходит
@locations = Location.send(params[:type]) if type_sent_and_valid? #refine to a particular type if present
@locations = (@locations || Location.locatable).near(latlng_params) if latlng_sent? #refine to location
@locations = (@locations || Location).member_of(@interest_group.id).paginate(:page=>params[:page], :per_page=>20)
Это, если строка параметров была чем-то вроде этого:
?lat=50amp;lng=150amp;type=restaurantamp;page=1
Тогда это должно привести к этому
Location.restaurant.near([50.0,150.0]).member_of(@interest_group).paginate(:page=>1, :per_page=>20)
Ответ №1:
Один из способов устранить это — использовать механизм скользящей области, при котором вы перемещаете область на один шаг за раз, используя ту же переменную:
location_scope = Location
if (type_sent_and_valid?)
location_scope = location_scope.send(params[:type])
end
if (latlng_sent?)
location_scope = location_scope.locatable.near(latlng_params)
end
location_scope = location_scope.member_of(@interest_group.id)
@locations = location_scope.paginate(:page=>params[:page], :per_page=>20)
Вы можете добавить другие условия по мере необходимости.