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

#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)
  

Вы можете добавить другие условия по мере необходимости.