有一个更好的方法吗?即更好地链接命名范围

时间:2011-05-04 17:48:14

标签: ruby-on-rails ruby named-scope method-chaining

这段代码工作得很好,我正在看它,并认为它可以更清洁。也许有更惯用的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)

如果params字符串是这样的话:

?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 个答案:

答案 0 :(得分:2)

清理它的一种方法是使用滑动范围机制,使用相同的变量一次一步地移动范围:

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)

您可以根据需要添加其他条件。