Tag: arel

通过共同的关联数排序,即使没有(轨道)

我正在研究一个与此问题有着非常相似的窘境的项目: 按共同关联数量排序(Rails) 问的提问者(霓虹灯)写道, 背景:我有post和用户,都有很多社区。 目标:对于任何给定的用户,我想返回一组post,按照post与用户共有的社区数量排序(更多社区的post更高) 不幸的是,该解决方案仅包括至少有一个共同社区的post。 我的quandry需要包括按共同社区数量排序的所有post。 扩展目标:结果必须是AREL对象, 所有post按公共社区的数量排序,包括与用户共同拥有零社区的post(共同拥有更多社区的post更高)。

使用SET将复杂的SQL查询转换为Arel或Squeel

如何使用AREL或Squeel翻译给定查询: SET @start = ‘2013-05-14’; SET @end = ‘2013-11-01’; SET @days = DATEDIFF(@end, @start); SET @UnusedDays = 0; SELECT @UnusedDays := DATEDIFF(end_at,@end) FROM PERIODS WHERE (@end > start_at AND @end = start_at AND @start = start_at AND @start < end_at) OR (end_at @start) OR (@end > start_at AND @end <= end_at); 将它用作原始SQL的解决方案也将受到欢迎,因为到目前为止我无法运行它。 更新:在SQL请求中描述期间模型和目标, 以查找是否完全覆盖了期间 UPDATE2:如果我尝试使用原始的SQL查询,如: […]

如果关联具有limit子句,则AssociationRelation属性上的Rails sum不正确

我有一个方法可以计算模型中许多浮点属性的统计数据(主要是总和)。 模特 class GroupPlayer < ActiveRecord::Base belongs_to :group has_many :scored_rounds has_many :rounds, dependent: :destroy end class Round < ActiveRecord::Base belongs_to :group_player end class ScoredRound < Round # STI end 提供最多4个浮点属性的统计信息的方法,这些属性是从其他方法调用的,具体取决于我是否获得了一个玩家或一组玩家的统计数据。 ScoredRound上的初始filter传递给方法(sr) def method_stats(method,sr,grp) rounds = sr.where.not(method => nil) number_rounds = rounds.count won = rounds.sum(method).round(2) if method == :quality dues = grp.options[:dues] * number_rounds else dues […]

使用Arel生成子查询以获得平均值

可以说我有几张桌子 orders = Arel::Table.new :orders stores = Arel::Table.new :stores managers = Arel::Table.new :managers 经理有很多商店,商店有很多订单。 有一天,我想查询经理工作的订单的平均总数。 哦,我想把它归到商店。 所以要清楚,我想得到一个经理的平均订单总额,对于他们工作的每个商店。 我们假设我们已经找到了我们的经理: manager = Manager.find(some_id) totals = orders.where(orders[:store_id].in(manager.store_ids)).group(orders.store_id).project(orders[:total].average) puts totals.to_sql “SELECT AVG(`orders`.`total`) AS avg_id FROM `orders` WHERE `orders`.`store_id` IN (1, 2, 3) GROUP BY `orders`.`store_id`” 是的,这很棒。 但是,如何查询这些平均值的平均值? 什么是Arel来获取此查询? “SELECT AVG(avg_id) FROM (SELECT AVG(`orders`.`total`) AS avg_id FROM `orders` WHERE `orders`.`store_id` […]

在named_scope中通过2个带有条件的表进行排序

我正在寻找解决方案如何按属性排序,这是两个关联级别深,也有一个条件。 我有与商店模型或仓库模型有关联的订单模型这两个模型都与有名称的国家相关联。 我的目标是: 缩小订单并按国家/地区名称排序。 结果必须是ActiveRelation对象 主要目标是将此范围用于MetaSearch gem for view helper sort_link class Order true, :if => “warehouse_id.nil?” validate :warehouse_id, :presence => true, :if => “shop_id.nil?” #the case with shop_id.present? && warehouse_id.present? does not exist scope :sort_by_country_name, ??? end class Shop < ActiveRecord::Base belongs_to :country end class Warehouse [:id, :name, …] Actualy我不知道这是否可能所以我感谢任何建议。 谢谢

Rails Arel与连接表上的where条件连接

我正在尝试将以下Rails where子句转换为使用Arel,主要是为了利用Arel提供的方法。 发布模型 class Post belongs_to :user end 用户模型 class User has_many :posts end 我正在寻找Mark发布的post。 这是Rails查询: Post.joins(:user).where(users: { first_name: ‘Mark’ }) 我需要用Arel转换这个查询。 提前致谢!

使用select()的Rails ActiveRecord / Arel查询聚合列

我有两个带连接表的基本模型。 我添加了一个范围来计算关系中的计数,并将其作为属性/ psuedo-column公开。 一切正常,但我现在想查询列的子集并包含count列,但我不知道如何引用它。 tldr; 如何在我的Arel查询中包含聚合(如计数),同时还要选择列的子集? 模型是Employer和Employee ,通过Job加入。 以下是Employer的相关代码: class Employer do left_outer_joins(:employees). group(“employers.id”). select(“employers.*, count(employees.*) as employees_count”) end end 这允许我向雇主加载计数: employers = Employer.include_counts.where(id: 1) 然后引用计数: count = employers[0].employees_count 我正在我的控制器中加载记录,然后呈现它。 不过,我不想渲染超出我需要的字段。 在添加计数之前,我可以这样做: employers = Employer.where(id: 1).select(:id, :name) 当我添加我的include_counts范围时,它基本上忽略了select() 。 它不会失败,但它最终包括所有列,因为我的范围中的这一行: select(“employers.*, count(employees.*) as employees_count”) 如果我从范围中删除employers.*那么我的结果中没有任何列,无论是否有select()子句。 我试过这个: employers = Employer.include_counts.where(id: 1).select(:id, :name, :employee_counts) …但是会产生以下SQL: SELECT employers.*, […]

使用选择调用的双嵌套连接的Rails活动记录查询

我有以下架构: 照片has many组has many用户。 我使用这个Rails服务器作为iOS应用程序的后端,并且在添加照片时不断需要向组的所有相关用户推送通知。 我的问题是找到最便宜的查询来解决仅受影响的User.ids 。 到目前为止我有 Photo.find(1).groups.joins(:users) 我知道在此之后我必须输入一个select参数,但是无法弄清楚我生活的语法。 鉴于照片,我正在寻找最有效的方法来查找受影响的用户ID的集合。 任何帮助将非常感激!!!

ActiveRecord通过针对STI类的作用域构建错误类的实例

我希望能够通过其STI类型在一个以某类模型为目标的作用域上调用build方法,并让ActiveRecord构建一个正确类的实例。 class LineItem < ActiveRecord::Base scope :discount, where(type: 'DiscountLineItem') end class DiscountLineItem LineItem.discount.build # Expect an instance of DiscountLineItem here => # 在这里,我期待一个DiscountLineItem的实例,而不是LineItem一个实例。

与Arel(Rails 3)的加载关联计数

简单的任务:鉴于文章有很多评论,能够在很长的文章列表中显示每篇文章有多少评论。 我正在尝试研究如何使用Arel预加载此数据。 README文件的“复杂聚合”部分似乎讨论了这种情况,但它并不完全提供示例代码,也没有提供在两个查询而不是一个连接查询中执行此操作的方法,这对于性能。 鉴于以下内容: class Article has_many :comments end class Comment belongs_to :article end 我如何预装文章设置每个评论有多少?