Model.all和Model.find(id):我可以用一个查询做到这一点吗?

时间:2013-01-17 16:04:21

标签: ruby-on-rails ruby-on-rails-3 rails-activerecord

我有两种型号:建筑和公寓。建筑has_many:公寓和公寓has_many:建筑物。在公寓索引中,我想列出所有建筑物,以便用户可以过滤他们所在建筑物的公寓。但是,有时我还要拉一个特定的公寓 - 如果已经给出了公寓ID。现在,在公寓#index中,我有:

def index

@buildings = Buildings.all

    if params[:building_id] # the apartments resource is nested in the building resource route.
        @building = Building.find(params[:building_id])
    end

end

有没有更好的方法来执行此操作,而无需运行两个查询?

3 个答案:

答案 0 :(得分:0)

好的替代方案可能是。

@buildings = Building.all

    if params[:building_id] 
        @building = @buildings.select{|b| b.id == params[:building_id}.first
    end

end

但是如果集合非常大,那么性能很差,所以保持2分钟的调用。

答案 1 :(得分:0)

detect方法在枚举中搜索与块匹配的对象,例如

building = buildings.detect {|b| b.id == params[:building_id].to_i}

这将是要搜索的建筑物数量的线性,但如果建筑物的数量足够小,您无论如何都要加载它们,这可能不是问题。

答案 2 :(得分:0)

您可以使用ruby的Array#select从所获取的数组中选择所需的项目。

def index
  @buildings = Buildings.all
  if params[:building_id] 
    @building = @buildings.select({|building| building.id == params[:building_id]}).first
  end
end