Tag: sql

在RoR中将简单查询转换为棘手的命名范围

我有一个简单的范围问题。 我想这样做作为一个范围: if article.responses.blank? return false elsif article.responses.last.passed.eql?(false) return true else return false end 所以在文章模型上我会有这样的事情: scope :failed_response, { :joins=>[:responses], :conditions=>[“responses.passed = ?”, false] } 问题是,我只想要最近响应失败的实例。 我确信这些是用花式排序或某种嵌套查询来做到这一点的方法,但我被卡住了。 谢谢!

rails postgres ERROR:类型为double precision的输入语法无效

我正在尝试以下方法: user_calendars.where(“extract(day from time_from) = ? “, next_day) 但我一直得到这个错误: PG::InvalidTextRepresentation: ERROR: invalid input syntax for type double precision: “Saturday” LINE 1: …”user_id” = $1 AND (extract(day from time_from) = ‘Saturday’… 不知道为什么它指出类型double。

使用SQL检索一组记录,然后使用Rails对它们进行排序

使用Rails 3.2和MariaDB。 我的表有500,000行。 在通常的查询中,我们将在其中添加order子句,如下所示: # takes 4000ms to load, returns 100 records @shops = Shop.where(:shop_type => ‘fashion’).order(‘overall_rating DESC’) 如果我们删除order ,则加载时间会大大减少: # takes 20ms to load, returns 100 records @shops = Shop.where(:shop_type => ‘fashion’) 是否可以首先检索@shops 100记录,然后使用Rails通过overall_rating DESC对它们进行overall_rating DESC而不涉及SQL? 或者,将查询分为两部分:首先检索100条记录,然后订购该组记录。 这可以大大提高性能。

Rails查询 – 每天的最新post

User has_many Posts 。 我想检索每天的最新post(使用created_at ),忽略可能早先写过的其他post。 提出这个问题的另一种方法可能是按部门要求每个收入最高的员工 – 我认为这是同样的事情。 如何在Rails中编写此查询(最好是4.0)? 我认为它与group和maximum但我似乎无法得到它。 有没有办法在不诉诸SQL的情况下做到这一点? 为了澄清,我想要返回的是一系列post对象,它们是各自日期写的最后一个。 谢谢!

友谊has_many通过模型与多个状态’

目前我的用户模型具有以下代码: has_many :notifications has_many :friendships has_many :friends, :through => :friendships, :conditions => { status: ‘accepted’ } has_many :requested_friends, :through => :friendships, :source => :friend, :conditions => { status: ‘requested’ } has_many :pending_friends, :through => :friendships, :source => :friend, :conditions => { status: ‘pending’ } 我的友谊模型如下: belongs_to :user belongs_to :friend, :class_name => “User” def self.request(user, friend) […]

ActiveRecord加入聚合查询

我有一个Unit模型has_many :transacions 。 交易有一个type列,表明它是什么类型的交易:销售,转让,预订等。 我想找到具有给定交易类型的所有单位作为他们的最新交易。 我无法弄清楚如何在ActiveRecord中执行此操作。 在SQL中,如果我想找到所有以“Transfer”作为最新事务的单位,我可以这样做: SELECT u.*, tx.* FROM units u INNER JOIN transactions tx ON u.id=tx.unit_id INNER JOIN ( SELECT tx.unit_id, max(tx.created_at) AS latest_tx_date FROM transactions tx GROUP BY tx.unit_id ORDER BY tx.unit_id ) max_dates ON (tx.unit_id=max_dates.unit_id AND tx.created_at>=max_dates.latest_tx_date) WHERE tx.type=’Transfer’; 这是我遇到麻烦的内部查询的加入。 是否有可读的ActiveRecord方法来执行此操作,还是应该使用SQL?

Rails:如何获取深度为2’has_many’级别的记录?

我已经设置了这些模型: Course has_and_belongs_to_many Student Student has_and_belongs_to_many Course has_many Books Book belongs_to Student 如何使用ActiveRecord高效获取课程的所有书籍?

Postgres查询ILIKE和“%#{}%”

我可以向我解释一下“?” 防止SQL注入? Candy.where(“taste ILIKE ?”, “%#{term}%”) 另外,为什么使用“%{term}%”而不是#{term}? 百分比代表什么?

与ORDER结合使用时DISTINCT的问题

我正在尝试建立一个网站,为特定事件中的一些运动员排名表现 – 我之前发布了一个问题,收到了一些好的回答,我现在可以确定我的代码的关键问题。 我有2个模型 – Athlete和Result (运动员有很多结果) 每个运动员都可以记录特定赛事的一些时间,我想确定每个运动员最快的时间,并在所有运动员中排列这些最快的时间。 我使用以下代码: params[:justevent]).joins(:athlete).order(‘performance_time_hours ASC’).order(‘performance_time_mins ASC’).order(‘performance_time_secs ASC’).order(‘performance_time_msecs ASC’) %> 这成功地对所有运动员的所有结果进行排序(即一名运动员可以根据他们记录的时间在不同的地方出现多次)。 我现在希望为每位运动员取出最佳成绩,并将其纳入排名。 我可以使用以下方法选择与最佳结果相对应的时间: params[:justevent]).where(:athlete_id => filtered_name.athlete_id).order(‘performance_time_hours ASC’).order(‘performance_time_mins ASC’).order(‘performance_time_secs ASC’).order(‘performance_time_msecs ASC’).first() %> 但是,当我尝试识别@filtered_names列出的不同运动员名字时,我的问题出现了。 我尝试使用但这并不像我预期的那样,有时它会以错误的顺序排名。 我发现,因为它代表我的代码基本上寻找不同的运动员结果之间的差异,从小时时间开始到进展到分钟,秒和毫秒。 一旦发现每个不同运动员的结果之间存在差异,它就会相应地命令它们。 例如,如果我有2名运动员: Time for Athlete 1 = 0:0:10:5 Time for Athlete 2 = 0:0:10:3 这将产生命令,运动员2,运动员1 但是,如果我有: Time for Athlete 1 = 0:0:10:5 Time for Athlete 2 […]

迭代大型外部postgres db,操作行,将输出写入rails postgres db

我有一个postgres DB,大约有200,000,000行和6列。 列具有int,date和string,但没有主键,也没有基于主键的唯一值。 此DB中的记录包含我的一个rails postgres模型所需的原始数据。 我想迭代完整的外部数据库,对其每一行执行计算,然后将输出写入我的rails模型。 我没有问题连接到数据库或通过ActiveRecord访问记录,但我尝试迭代数据库的所有内容都失败或耗时太长。 我尝试过以下方法: ExternalDB.all.each ExternalDB.find_all.each 使用这些说明向ExternalDB添加“id”列 我认为答案是使用SQL进行迭代,但我甚至不确定如何开始。