Есть лучший способ сделать это? то есть цепочка названных областей более приятна - PullRequest
1 голос
/ 04 мая 2011

Этот код работает нормально, но я смотрю на него и думаю, что он может быть чище. Возможно, есть более идиоматичный способ сделать это с помощью 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=50&lng=150&type=restaurant&page=1

Тогда должно получиться это

Location.restaurant.near([50.0,150.0]).member_of(@interest_group).paginate(:page=>1, :per_page=>20)

1 Ответ

2 голосов
/ 04 мая 2011

Один из способов исправить это - использовать механизм скользящей области, где вы перемещаете область по одному шагу за раз, используя одну и ту же переменную:

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)

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

...