Tag: sql

传递给#or的关系必须在结构上兼容。 不兼容的值:

我有两个查询,我需要一个or它们之间,即我想要第一个或第二个查询返回的结果。 第一个查询是一个简单的where() ,它获取所有可用的项目。 @items = @items.where(available: true) 第二个包括join()并给出当前用户的项目。 @items = @items .joins(:orders) .where(orders: { user_id: current_user.id}) 我尝试以各种forms将这些与Rails’ or()方法结合起来,包括: @items = @items .joins(:orders) .where(orders: { user_id: current_user.id}) .or( @items .joins(:orders) .where(available: true) ) 但我一直遇到这个错误,我不知道如何解决它。 Relation passed to #or must be structurally compatible. Incompatible values: [:references]

使用activerecord如何根据字段的最高值选择记录?

我遇到了一些我不知道如何处理活动记录(实际上我不能确切地说如何用sql做)我想做的事情。 我想根据某个字段的最高值以及其他一些标准选择记录。 下面是一些伪造的东西,它解释了我的情况。 鉴于以下记录: id:1 | name:recipe1 | saved:true | revision:1 id:2 | name:recipe1 | saved:false | revision:2 id:3 | name:recipe1 | saved:true | revision:3 id:4 | name:recipe1 | saved:false | revision:4 id:5 | name:recipe2 | saved:true | revision:1 id:6 | name:recipe2 | saved:true | revision:2 id:7 | name:recipe3 | saved:false | revision:1 id:8 | […]

复杂Rails使用ActiveRecord查询多对多关系

我有以下型号 class Element has_many :tags, through: :tags_elements end class Tag has_many :elements, through: :tags_elements end 我需要:与变量上定义的所有标签相关的元素。 即所有带标签的元素:[“gt40”,“car”] 我尝试过以下方法: class Element scope :search_tags, lambda { |df| joins(tags_elements: :tag) .where(‘tags.name IN (?) ‘, df) .distinct(‘id’) } 所以我能做到 tag_list = [“gt40″,”car”] Element.search_tags(tag_list) 但它返回包含任何标记的外部元素。 但是我需要与ALL标签相关的元素。 有帮助吗?

Active Record不存在连接表记录的情况

我试图获取连接表中不存在的所有记录的列表。 模型是User,Game和MarkedGame,用户可以将游戏标记为已播放。 这是一个多对多的关系: User > MarkedGame < Game 我想要的是所有未被用户标记的游戏列表。 我知道我可以做两个单独的查询并减去它们: Game.all – current_user.games 但我不喜欢这给我留下一个数组而不是一个Active Record关系对象。 此外,似乎应该有一种更高效的方式。 如果没有Active Record处理这个方法,是否有SQL方式? 我的原始SQL不是特别强大,所以任何帮助都会受到赞赏。 谢谢。

找到所有子记录都具有给定值的所有父记录(但不仅仅是一些子记录)

一个活动有很多参与者。 参与者具有“状态”字段。 class Event < ActiveRecord::Base has_many :participants end class Participant < ActiveRecord::Base belongs_to :event end 我需要找到除以下事件之外的所有事件:每个参与者都具有“现在”状态的事件。 我可以通过以下AR代码找到其中一些参与者具有“现在”状态的所有事件: Event.joins(:participants).where .not(participants: {status: ‘present’}) .select(“events.id, count(*)”) .group(“participants.event_id”) .having(“count(*) > 0”) 这就创建了SQL: SELECT events.id, participants.status as status, count(*) FROM `events` INNER JOIN `participants` ON `participants`.`event_id` = `events`.`id` WHERE (`participants`.`status` != ‘present’) GROUP BY participants.event_id HAVING count(*) > 0 […]

ActiveRecord语法,用于在使用连接时查找平均评级为x或更高的所有项目

我的rails应用程序中有两个模型。 项目和评论。 评论属于Item和Items有很多评论。 审核模型如下所示: create_table “reviews”, :force => true do |t| t.text “comment” t.integer “rating” t.integer “reviewable_id” t.string “reviewable_type” t.datetime “created_at” t.datetime “updated_at” end (评论是多态的,这就是为什么他们有reviewable_id和reviewable_type) 我正在尝试组合一个ActiveRecord查询,这将允许我选择平均评级为80或更高的所有项目。 我已经尝试了许多不同的变化,我认为这些变化有用 Item.joins(:reviews).where(“avg(reviews.rating) > 80”).group(:id) 但是这会导致以下错误: Error: Mysql2::Error: Invalid use of group function: SELECT `items`.* FROM `items` INNER JOIN `reviews` ON `reviews`.`reviewable_id` = `items`.`id` AND `reviews`.`reviewable_type` = ‘Item’ WHERE (avg(reviews.rating) […]

使用.select时,Rails会忽略第二个表中的列

例如: r = Model.arel_table s = SomeOtherModel.arel_table Model.select(r[:id], s[:othercolumn].as(‘othercolumn’)). joins(:someothermodel) 将产品sql: `SELECT `model`.`id`, `someothermodel`.`othercolumn` AS othercolumn FROM `model` INNER JOIN `someothermodel` ON `model`.`id` = `someothermodel`.`model_id` 哪个是对的。 但是,加载模型时,属性othercolumn被忽略,因为它不是Model的属性。 它类似于急切加载和includes ,但我不希望所有列,只有指定的那么include是不好的。 必须有一种从其他模型中获取列的简单方法吗? 我最好将项目作为Model实例返回,而不是简单的数组/哈希

如何在Rails中使用GROUP_CONCAT?

我有以下查询,我想与ActiveRecord一起使用,以便它可以在生产服务器上的基于ORACLE的本机查询中进行翻译。 现在我正在使用SQLITe。 select c.name,co.code,GROUP_CONCAT(c.name) AS GroupedName from countries c INNER JOIN continents co on c.continent_code = co.code INNER JOIN event_locations el on el.location_id = c.id group by co.code

Rails数据库布尔值

代码优先: create_table :users do |t| … t.boolean :is_active, :default => true … end 现在,这是我的问题 – 我正在创建一个rake任务来导入大量的记录(10,000+)。 我已经做了大量的测试和基准测试,并确定执行此任务的最快和最有效的方法是创建一个巨大的原始SQL语句。 (我正在从CSV读取数据)。 举个例子: inserts = Array.new FasterCSV.foreach(…) do |row| inserts.push “(row[0], row[1]…)” end User.connection.execute “INSERT INTO users (…) VALUES #{inserts.join(“, “)}” 一切都很好。 整个过程在(字面上)秒内完成,而不是使用ActiveRecord完成1.5小时。 但是,我的问题在于布尔字段。 我在SQLite上本地开发,但在生产中使用MySQL。 当使用ActiveRecord时,Rails确定要在“布尔”字段中放置什么(因为几乎所有数据库都不同)。 我正在编写自定义SQL,我想知道是否有办法可以做类似…… INSERT INTO users(…, is_active, …) VALUES (…, ActiveRecord::Base.connection.boolean.true, …) …正确返回特定于数据库的布尔值。 任何回答“只使用ActiveRecord”的人都将被拒绝投票。 在这种情况下,这根本不可行。 […]

如何通过rails迁移设置Postgres中主键(ID)列的起始点

我正在将一个rails应用程序部署到heroku,后者使用PostgreSQL作为后端。 在我的数据库迁移中,我通常会将报告等内容的ID字段设置为至少1000,大多数客户似乎不喜欢从1开始。 通常我使用mysql,我只是在创建表后添加一个特定的sql: def self.up create_table :reports do |t| t.references :something … end execute(“ALTER TABLE reports AUTO_INCREMENT = 1000;”) end 有没有人知道如何为PostgreSQL实现同样的目标,理想情况下我希望迁移来构建表本身,这样就不是特定于DB的。 我想实现我的目标的一个愚蠢的方法是在循环中创建和删除999条记录,哎哟。