ruby-on-rails – 使用许多基于关联的限制对分页记录进行排序分组

ruby-on-rails – 使用许多基于关联的限制对分页记录进行排序分组,第1张

概述我正在开发一个作为场所目录的应用程序(当前,但可能并非总是)允许基于1个城市,1个社区和1个类别过滤特定企业的场所.类别可以嵌套,因此它们具有parent_id.通过查看下面的模型代码可以理解这些关联(一切都相当简单).到目前为止,一切都在顺利进行,但还有一个障碍. 首先,一些会影响答案的重要说明. 我正在使用will_paginate对一个场馆协会进行分页.话虽这么说,我不能在阵列上分页.好吧, 我正在开发一个作为场所目录的应用程序(当前,但可能并非总是)允许基于1个城市,1个社区和1个类别过滤特定企业的场所.类别可以嵌套,因此它们具有parent_ID.通过查看下面的模型代码可以理解这些关联(一切都相当简单).到目前为止,一切都在顺利进行,但还有一个障碍.

首先,一些会影响答案的重要说明.

我正在使用will_paginate对一个场馆协会进行分页.话虽这么说,我不能在阵列上分页.好吧,我可以,但性能将是一个问题.

2.我使用Tag模型作为业务及其相关类别之间的链接对象.目前,该界面仅设置为允许将一个类别附加到任何给定的业务,并且必须至少附加一个.我计划稍后扩展面向公众的页面的界面以允许按多个类别进行过滤,因此不能对应用程序结构的这一部分进行更改,除非有更好,更好的方法来完成此 *** 作.

3.可能(希望)存在的一种可能的解决方案是在Arel中使用表连接,或者允许类别自行连接以获取父级的范围.目前,如果解决方案假设嵌套不超过1级,我会觉得可以接受.不过,这种牺牲是最后的手段,因为它会对我希望将来引入的功能产生阻碍.

4.与最后一点相关,我查看了will_paginate / array,但被他们的免责声明吓坏了(“如果你知道你正在做什么,并且确实需要对数组进行分页,则明确要求使用此功能”).记住我在尝试推出自己的分页插件时遇到的性能噩梦,我想避免这种情况,除非有人能够充分向我解释这种解决方案的性能后果.

这个网站需要能够受到重创.现在,所有内容都被缓存,数据库非缓存命中数相对较少.它必须保持这种状态.

现在,我想提出的问题.

背景:一些面向公众的观点的设计规范要求当前城市的所有场地都显示在一个列表中,并按父类别分组(不显示任何子类别,但所有商业标签属于子类别的场所应该也可以与标签属于父母的场所分组.然后按父类别对这些场地进行分类,然后根据场地所属的业务名称进行排序.这需要是一个平坦的关联,然后将其输入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 => :venuesend

应用程序/模型/ venue.rb:

# FIElds: ID,business_ID,city_ID,neighborhood_ID,...class Venue < ActiveRecord::Base  belongs_to :business  belongs_to :city  belongs_to :neighborhoodend

应用程序/模型/ tag.rb:

# FIElds: ID,category_ID,...class Tag < ActiveRecord::Base  belongs_to :business  belongs_to :category  belongs_to :venueend

应用程序/模型/ category.rb:

# FIElds: ID,parent_ID,...class category < ActiveRecord::Base  has_many :Tags,:dependent => :destroyend

应用程序/模型/ city.rb:

# FIElds: ID,...class City < ActiveRecord::Base  has_many :neighborhoods,:dependent => :destroy  has_many :venuesend

应用程序/模型/ neighborhood.rb:

# FIElds: ID,descriptionclass Neighborhood < ActiveRecord::Base  belongs_to :city  has_many :venues  has_many :businesses,:through => :venuesend

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

附:使用Rails 3.0.9为MysqL应用程序.

P.S.S.我也对基于多个嵌套关联字段的可能值简化这种过滤的模式或宝石感兴趣.我将使用嵌套集模型gem(例如Awesome nested Set)以这种方式分组/排序/分页,为任何能够提供精确解决方案的人提供upVote接受赏金.

解决方法

no subcategorIEs are to be displayed,but all venues who’s businesses’ Tags belong to a subcategory should be also grouped with the venues who’s Tags belong to the parent.

正如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 # ClassMethodsend#then with some category@animals = Animal.tree(@mamal_category)

这将使你在一个sql调用中获得所有食草动物,食肉动物,杂食动物等以及子子类别,并且它是易于分类的,可排序的,因为它是一个范围.

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

总结

以上是内存溢出为你收集整理的ruby-on-rails – 使用许多基于关联的限制对分页记录进行排序/分组全部内容,希望文章能够帮你解决ruby-on-rails – 使用许多基于关联的限制对分页记录进行排序/分组所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1273760.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存