4

我正在充当地方目录和应用程序分页(目前是,但也许并不总是)允许基于1个城市的特定企业的场地过滤, 1个街区,1个类别。类别可以嵌套,因此它们具有parent_id。通过查看下面的模型代码可以理解这些关联(一切都相当简单)。到目前为止,一切运行顺利,但还剩下一个障碍物。排序/成组记录了许多基于关联的限制

首先,这将影响到一些答案的重要说明。

1.我正在使用will_paginate来为场地协会分页。这就是说,我不能在数组上分页。那么,我可能,但表现将是一个问题。

2.我使用标记模型作为业务及其关联类别之间的链接对象。目前,该接口只允许设置一个类别附加到任何给定的业务,至少一个必须连接。我计划以后扩大页面,以允许多个类别过滤面向公众的接口,这样的变化无法对应用程序结构的这一部分,除非有一个多,完成这更好的方法

3.一种可能的解决方案,它威力(希望)存在是别名的表格加入阿雷尔或对自己一范围允许分类自连接得到在父。目前,如果解决方案假设不会有超过1层的嵌套,我会发现它是可以接受的。尽管如此,这种牺牲是最后的选择,因为它将会阻碍我想在未来推出的功能。

4.相关的最后一点,我已经看过will_paginate/array,但被他们的免责声明吓跑了(“如果你知道你在做什么,真的需要分页阵列,明确需要此功能”) 。记住过去我尝试推出自己的分页插件时遇到的性能噩梦,我想避免这种情况,除非有人能够充分向我解释此类解决方案的性能影响。

5.这个网站需要能够采取冲击。目前,所有内容都被缓存,数据库非缓存命中相对较少。它必须保持这种方式。现在

,这个问题我想提出。

背景:一些面向公众的意见设计规范的要求,从目前全市所有场馆将显示在列表中,并通过父类别分组(无子将被显示,但所有的场馆是谁的企业'属于子类别的标签也应该与标签属于父母的场所一起分组)。然后这些场地按父类别排序,其次排序为场地所属商业的名称。这需要一个平面关联,然后输入到will_paginate中。这个场地的ActiveRecord查询,我将在下文中将其称为@venues,然后转储到JSON中,缓存并呈现给页面。

问题:如何构建@venues与指定的分组/排序,以便这些场馆可适当分页,并根据该接口的规格显示?

应用程序/模型/ business.rb

# Fields: id, name, description, keywords, ... 
class Business < ActiveRecord::Base 
    has_many :tags, :dependent => :destroy 
    has_many :categories, :through => :tags 

    has_many :venues, :dependent => :destroy 

    has_many :cities, :through => :venues 
    has_many :neighborhoods, :through => :venues 
end 

应用程序/模型/ venue.rb

# Fields: id, business_id, city_id, neighborhood_id, ... 
class Venue < ActiveRecord::Base 
    belongs_to :business 
    belongs_to :city 
    belongs_to :neighborhood 
end 

应用程序/模型/ tag.rb

# Fields: id, category_id, business_id, ... 
class Tag < ActiveRecord::Base 
    belongs_to :business 
    belongs_to :category 
    belongs_to :venue 
end 

应用程序/模型/ category.rb

# Fields: id, parent_id, name, description, ... 
class Category < ActiveRecord::Base 
    has_many :tags, :dependent => :destroy 
end 

应用程序/模型/ city.rb

# Fields: id, name, description, ... 
class City < ActiveRecord::Base 
    has_many :neighborhoods, :dependent => :destroy 
    has_many :venues 
end 

应用程序/模型/ neighborhood.rb

# Fields: id, city_id, name, description 
class Neighborhood < ActiveRecord::Base 
    belongs_to :city 
    has_many :venues 
    has_many :businesses, :through => :venues 
end 

这是一个需要解释的问题,如果需要,我可以提供更多信息。

P.S.使用Rails 3.0.9为这个应用程序使用MySQL。

P.S.S.我也对根据多个嵌套关联字段的可能值简化了这种过滤的模式或宝石感兴趣。我会授予upvote + accept +赏金给任何人可以提供一个精确的解决方案,使用嵌套设置模型宝石,如Awesome Nested Set以这种方式进行分组/排序/分页。

+1

关于点#3:如果您预计类别查找到多于写,你应该看看[嵌套集模型(http://mikehillyer.com/articles/managing-hierarchical- data-in-mysql /)继承。它将允许无限的嵌套深度,轻松包含子类别,并摆脱自我加入。干杯! –

回答

3

不会显示子类别,但所有业务标签属于子类别的场所也应与标签属于父级的场所进行分组。

作为Xavier在评论中表示,您应该使用嵌套集合模型。我用这一个:

https://github.com/collectiveidea/awesome_nested_set

这一点让我进行分页的能力和排序像往常一样:

module Category 
    extend ActiveSupport::Concern 
    included do 
    belongs_to :category 
    scope :sorted, includes(:category).order("categories.lft, #{table_name}.position") 
    end 

    module ClassMethods 
    def tree(category=nil) 
     return scoped unless category 
     scoped.includes(:category).where([ 
     "categories.lft BETWEEN ? AND ?",category.lft, category.rgt 
     ]) 
    end 
    end # ClassMethods 
end 

#then with some category 
@animals = Animal.tree(@mamal_category) 

,将让你所有的食草动物,食肉动物,杂食动物等等等等和子子在一个SQL调用中的类别,它很容易分页,可排序,因为它是一个范围。

另见:get all products of category and child categories (rails, awesome_nested_set)

相关问题