我有桌子房子,公司,街道,房屋类型和相关模型。
每个房子都属于公司,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
我认为我的代码不是很好。 我可以用模型做什么?(把所有代码都放到范围内 - 好主意?)
这样的视图生成有任何漂亮的插件吗?
答案 0 :(得分:1)
这是完全可以接受的,事实上你应该如何做Rails,保持瘦的控制器和胖模型,一旦你开始认为你的模型有太多的代码,你也可以将这些方法细分为模块,如 User :: CompanyFilters ,您可以将所有过滤器与公司相关联并保持代码模块化,但这不是必需的。
此外,不要对结果执行 uniq ,而是尝试在SQL语句中使用 DISTINCT 或 GROUP BY ,这样你就可以了确保你没有通过线路(从你的数据库)发送不必要的信息,而不是创建不必要的ActiveRecord对象,因为它们构建和管理起来很昂贵。