在模型和视图中过滤

时间:2011-08-13 09:17:03

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

我有桌子房子,公司,街道,房屋类型和相关模型。

每个房子都属于公司,HouseType和Street

此外,我已经在House Model中使用了正确的范围方法:

scopes: belong_to_company, on_street, with_type

需要在视图中进行过滤。但是用户可以在过滤器中选择多个选项。他可以标记一些街道,也可以标记一些HouseTypes和一些公司。

所以我在House模型中添加了这样的方法:

def self.filter_for_types(company, street, types)
   houses = []
   each.types do |type|
       houses = houses + House.belong_to_company(company).on_street(street).with_type(type)
   end
   houses.uniq
end

def self.filter_for_streets(company, streets, types)
   houses = []

   each.streets do |street|
      houses = houses + House.filter_for_types(company, street, types)
   end
   houses.uniq
end

def self.filter(companies, streets, types)
   houses = []

   each.companies do |company|
      houses = houses + House.filter_for_streets(company, streets, types)
   end
   houses.uniq
end

所以在视野中我有一些它:

def index
   House.filter(params[:companies], params[:streets], params[:types])
end

我认为我的代码不是很好。 我可以用模型做什么?(把所有代码都放到范围内 - 好主意?)

这样的视图生成有任何漂亮的插件吗?

1 个答案:

答案 0 :(得分:1)

这是完全可以接受的,事实上你应该如何做Rails,保持瘦的控制器和胖模型,一旦你开始认为你的模型有太多的代码,你也可以将这些方法细分为模块,如 User :: CompanyFilters ,您可以将所有过滤器与公司相关联并保持代码模块化,但这不是必需的。

此外,不要对结果执行 uniq ,而是尝试在SQL语句中使用 DISTINCT GROUP BY ,这样你就可以了确保你没有通过线路(从你的数据库)发送不必要的信息,而不是创建不必要的ActiveRecord对象,因为它们构建和管理起来很昂贵。