Tag: sql

Rails嵌套SQL查询

我有一个数据库模型Position(lat,lon) ,它拥有latitudes和longitudes. 我有一个名为show_close_by的控制器动作,它接收一个以度为单位的位置(my_lat, my_lon) ,一个公差(以公里为单位),并且应该返回数据库中位于公差范围内的位置列表。 为此,我使用hasrsine_distance公式计算两个坐标(lat1, lon1, lat2, lon2)之间的公里距离(在地球表面上(lat1, lon1, lat2, lon2) 。 为了使查询更快,我在查询中编写了整个haversine_distance公式: … WHERE 2*6371*asin(sqrt( power( sin( (:lat2-latitude)*pi()/(180*2) ) ,2) + cos(latitude*pi()/180)*cos(:lat2*pi()/180)*power(sin( (:lon2-longitude)*pi()/(180*2) ),2) )) < tolerance 查询的细节无关紧要。 我的疑问是:是否有必要为数据库中的每个位置计算这个巨大的函数? 我可以使用更简单的function过滤掉一些显然距离太远的位置吗? 好吧,我可以:使用嵌套的SQL查询,我可以在数据库中查询大“正方形”(在纬度/经度空间内)的位置,然后使用更昂贵的三角函数过滤那些位置。 类似于以下内容: SELECT * FROM ( SELECT * FROM Positions WHERE lat-latitude < some_reasonable_upper_bound AND lon-longitude < same_upper_bound ) WHERE costly_haversine_distance < tolerance […]

使用Rails 4在日志中显示SQL查询

我在Ubuntu 14.04上通过我的终端“终结者”和我的shell“Fish Shell”在Ruby 2.1和Thin 1.6.2上使用Rails 4.0.4。 当我在开发模式下启动Rails服务器时,我的日志中没有SQL查询,只加载了JS和HTML文件。 我正在寻找类似的东西: User Load (3.0ms) SELECT “users”.* FROM “users” WHERE “users”.”id” = 3 ORDER BY “users”.”id” ASC LIMIT 1 (2.0ms) SELECT COUNT(*) FROM “users” WHERE (driver_register_state_cd = -2)

rails中的SQL查询构建器

我们正在尝试构建一个SQL查询构建器,允许用户使用可视化辅助进行查询。 我们已经得到了前端所有用户可以选择表添加条件等。 然而,我们的后端是一团糟,因为我们试图将这些查询作为字符串从用户获取条件,然后在我们的模型中制作适当的SQL字符串。 当我们添加对越来越复杂的查询的支持时,这最终将变得非常错误并且难以维护。 有人知道我们可以使用的sql builder插件,或者更好的方法来解决这个问题。

Rails ActiveRecord – 如何在两个日期之间获取记录

我在数据库中有两个日期列 – from_date和to_date 。 例: from_date : 2012-09-10 to_date : 2012-09-30 today : 2012-09-13 如果today的日期在from_date和to_date之间,我需要获取所有记录。 如何在SQL查询中执行此操作? 如果我已经加载了相应的记录,我可以很容易地决定,如果今天的日期在from_date和to_date之间,但我不知道,如何从数据库中直接获取这些记录。

在Ruby on Rails中采取vs首次演出

这是关于ActiveRecord查询方法的问题: first查找第一条记录(如果提供参数,则为前N条记录)。 如果没有定义订单,它将按主键排序。 take给出一条记录(如果提供了参数,则为N条记录),没有任何隐含的顺序。 订单将取决于数据库实施。 如果提供订单,则会受到尊重。 usecase:基于唯一属性从数据库中检索记录,例如。 User.where(email: ‘f@example.com’) 在这里, first生成 SELECT “users”.* FROM “users” WHERE “users”.”email” = ‘f@example.com’ ORDER BY “users”.”id”` ASC LIMIT 1 take生成 SELECT “users”.* FROM “users” WHERE “users”.”email” = ‘f@example.com’ LIMIT 1 因此,如上所述, first添加额外的排序条款。 我想知道take vs first之间是否存在性能差异。 比first take快,反之亦然?

为什么我的PostgreSQL数组索引没有被使用(Rails 4)?

我有一个PostgreSQL字符串数组作为表中的列。 我使用GIN方法创建了一个索引。 但是任何查询都不会使用索引(相反,他们使用filter对整个表进行顺序扫描)。 我错过了什么? 这是我的迁移: class CreateDocuments < ActiveRecord::Migration def up create_table :documents do |t| t.string :title t.string :tags, array: true, default: [] t.timestamps end add_index :documents, :tags, using: 'gin' (1..100000).each do |i| tags = [] tags << 'even' if (i % 2) == 0 tags << 'odd' if (i % 2) == 1 tags […]

Rails ActiveRecord where或clause

我正在寻找一个ActiveRecord查询,这就是我在下面的内容。 不幸的是你不能像这样使用OR。 什么是最好的执行方式? category_ids是一个整数数组。 .where(:”categories.id” => category_ids).or.where(:”category_relationships.category_id” => category_ids)

Rails / ActiveRecord按特定值排序

在Rails 3.2中是否有任何方便的方法来通过将具有特定字段的特定值的记录移动到关系的前面来订购ActiveRecord关系? 例如,如果MyModel具有属性country ,我想将具有country=’Spain’记录的任何查询返回的关系排序到关系的前面。

Active Record Query中基于时间的优先级

我有一个包含作业列表的表,显示时通常按created_at字段降序排序。 我正在添加一个“特色”布尔标志,这将增加客户能够更好地了解他们的工作列表的能力。 如果作业少于X天,我希望将精选列表固定在搜索结果的顶部。 如何通过现有查询修改以支持此function? Jobs.where(“expiration_date >= ? and published = ?”, Date.today, true).order(“created_at DESC”) 当前查询将拉回由created_at排序的所有当前已发布作业。

如何找到同时拥有猫狗的用户?

我想在2个具有多对一关系的表中进行搜索,例如 class User << ActiveRecord::Base has_many :pets end class Pet << ActiveRecord::Base belongs_to :users end 现在让我们说我有一些这样的数据 users id name 1 Bob 2 Joe 3 Brian pets id user_id animal 1 1 cat 2 1 dog 3 2 cat 4 3 dog 我想要做的是创建一个活动的记录查询,它将返回一个既有猫又有狗的用户(即用户1 – Bob)。 到目前为止,我的尝试是 User.joins(:pets).where(‘pets.animal = ? AND pets.animal = ?’,’dog’,’cat’) 现在我明白为什么这不起作用 – 它正在寻找一只既是狗又是猫的宠物,所以什么都不回报。 […]