0

我有两个模型:建筑和公寓。建筑物 has_many :公寓和公寓 has_many :建筑物。在公寓索引中,我想列出所有建筑物,以便用户可以根据他们所在的建筑物过滤公寓。但是,有时我还想拉出一个特定的公寓——如果公寓 ID 已经给出。现在,在 apartments#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

有没有更好的方法来做到这一点,而无需运行两个查询?

4

3 回答 3

0

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

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

这将与要搜索的建筑物数量呈线性关系,尽管如果建筑物的数量足够小以至于您无论如何都要加载它们,这可能不是问题。

于 2013-01-17T16:26:25.610 回答
0

很好的选择可能是。

@buildings = Building.all

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

end

但是如果集合真的很大,那么性能就会很差,所以请保留 2 个数据库调用。

于 2013-01-17T16:06:41.320 回答
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
于 2013-01-17T16:27:21.473 回答