我有两种型号:建筑和公寓。建筑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
有没有更好的方法来执行此操作,而无需运行两个查询?
答案 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