Tag: squeel

使用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查询,如: […]

优化困难查询(可能带有吱吱声)

有这样的代码(使用PublicActivity gem&Squeel) def index @activities = Activity.limit(20).order { created_at.desc } @one = @activities.where{trackable_type == ‘Post’}.includes(trackable: [:author, :project]) @two = @activities.where{trackable_type == ‘Project’}.includes trackable: [:owner] @activities = @one + @two end 但它创建了8个 SQL请求: SELECT “activities”.* FROM “activities” WHERE “activities”.”trackable_type” = ‘Post’ ORDER BY “activities”.”created_at” DESC LIMIT 20 SELECT “posts”.* FROM “posts” WHERE “posts”.”id” IN (800, 799, […]

如何在Postgres中进行查询以按月创建分组记录? (:created_at datetime列)

我有这个Ruby代码: def visits_chart_data(domain) last_12_months.collect do |month| { created_at: month, count: domain.visits.created_on_month(month).count } end end def last_12_months (0..11).to_a.reverse.collect{ |month_offset| month_offset.months.ago.beginning_of_month } end CreatedOnMonth只是一个范围: scope :created_on_month, -> (month = Time.now) { where{ (created_at >= month.beginning_of_month) & (created_at <= month.end_of_month) } } created_at只是一个标准的日期时间戳。 如何优化它以进行一次查询而不是12? 我看到有些人使用GROUP_BY,但是我对PostgreSQL不太好,能够自己构建这样的查询。 查询应按年份对记录进行分组并返回计数。 也许有人可以帮助我。 谢谢。

在与Squeel相同的关联上执行多个连接

在我的应用程序中,我必须建模:工作流程和步骤; 步骤belongs_to工作流程和工作流程has_many步骤。 步骤具有索引和布尔状态(“已完成”)。 我想检索其步骤1已完成且步骤2未完成的工作流程,即SQL中的类似内容: SELECT * FROM workflows w INNER JOIN steps s1 ON s1.workflow_id = w.id INNER JOIN steps s2 ON s2.workflow_id = w.id WHERE s1.index = 1 AND s1.completed = 1 AND s2.index = 2 AND s2.completed = 0 我试图用Squeel表达这个查询,但它似乎不允许在同一个关联上进行多个连接:我找不到命名连接的方法,当我输入类似这样的内容时: Workflow.joins{steps}.joins{steps} ,生成的SQL就是: SELECT `workflows`.* FROM `workflows` INNER JOIN `workflow_steps` ON `workflow_steps`.`workflow_id` = `workflows`.`id` […]

你会如何使用Squeel进行这个Rails子查询?

我想使用Squeel重构下面的查询。 我想这样做,以便我可以链接其中的运算符并重新使用查询的不同部分中的逻辑。 User.find_by_sql(“SELECT users.*, users.computed_metric, users.age_in_seconds, ( users.computed_metric / age_in_seconds) as compound_computed_metric from ( select users.*, (users.id *2 ) as computed_metric, (extract(epoch from now()) – extract(epoch from users.created_at) ) as age_in_seconds from users ) as users”) 查询必须全部在DB中运行,并且不应该是混合Ruby解决方案,因为它必须对数百万条记录进行排序和切片。 我已经设置了问题,因此它应该针对普通的user表运行,以便您可以使用它的替代方案。 对可接受答案的限制 查询应返回具有所有常规属性的User对象 每个用户对象还应包括extra_metric_we_care_about , age_in_seconds和compound_computed_metric 通过在多个地方打印出一个字符串,查询不应该复制任何逻辑 – 我想避免两次做同样的事情 [更新]查询应该在DB中都可以执行,以便在返回到Rails之前可以在DB中对可能包含数百万条记录的结果集进行排序和切片 [更新]该解决方案适用于Postgres数据库 我想要的解决方案类型示例 下面的解决方案不起作用,但它显示了我希望实现的优雅类型 class User < ActiveRecord::Base # […]

订购嵌套的has_many:通过关联计数

我正在尝试按照与特定组的用户关联的降序频率顺序对标签进行排序。 (ActiveRecord和Rails 3.2 – 如果有帮助我也安装了Squeel!) 用户有标签,组有用户。 因此,组通过用户具有标签。 class Group < ActiveRecord::Base has_many :users_groups # join table has_many :users, through: :users_groups has_many :tags, through: :users class User < ActiveRecord::Base has_many :users_groups # join table has_many :groups, through: :users_groups has_many :taggings # join table has_many :tags, through: taggings class Tag < ActiveRecord::Base has_many :taggings # join table […]

嵌套查询在squeel中

简短版本:如何在squeel中编写此查询? SELECT OneTable.*, my_count FROM OneTable JOIN ( SELECT DISTINCT one_id, count(*) AS my_count FROM AnotherTable GROUP BY one_id ) counts ON OneTable.id=counts.one_id long版本: rocket_tag是一个为模型添加简单标记的gem。 它添加了tagged_with方法。 假设我的模型是User ,带有id和name,我可以调用User.tagged_with [‘admin’,’sales’] 。 在内部它使用这个吱吱声代码: select{count(~id).as(tags_count)} .select(“#{self.table_name}.*”). joins{tags}. where{tags.name.in(my{tags_list})}. group{~id} 哪个生成此查询: SELECT count(users.id) AS tags_count, users.* FROM users INNER JOIN taggings ON taggings.taggable_id = users.id AND taggings.taggable_type = ‘User’ […]