这可能是一个简单的问题,但我似乎在竭尽全力寻找一个优雅的解决方案.我有两个ActiveRecord模型类,其中一个是has_one,属于它们之间的关联:

class Item < ActiveRecord::Base
  has_one :purchase
end

class Purchase < ActiveRecord::Base
  belongs_to :item
end

我正在寻找一种优雅的方法来查找所有物品对象,这些物品没有与之关联的购买对象,理想情况下,不必在物品上使用布尔值is_purchased或类似属性.

现在我有:

purchases = Purchase.all
Item.where('id not in (?)', purchases.map(&:item_id))

这是可行的,但在我看来效率很低,因为它需要执行两个查询(而且购买可能是一个巨大的记录集).

Running Rails 3.1.0

推荐答案

这是一项非常常见的任务,SQL外部连接通常可以很好地完成.例如,看一看here.

在你的情况下,试着用

not_purchased_items = Item.joins("LEFT OUTER JOIN purchases ON purchases.item_id = items.id").where("purchases.id IS null")

Ruby-on-rails相关问答推荐

为什么Rails数值验证器不使用规格化值?

如何使用继承类 (STI) 获取 Ruby on Rails 类中基类的实例

我如何在不在 gemfile 中的 rake 任务中要求 gem?

如何在 Ruby on Rails 中正确存储 BigDecimal

如何创建一个融合了另外两个记录的 FactoryBot 工厂?

你能从 Heroku dynos/workers 中获得多少性能?

为 ActionMailer 渲染不同的视图(模板)

如何判断是否已经在 ruby​​ on rails 的数据库事务中?

如何将 Ruby 哈希转换为 XML?

是否可以在 Rails 中否定范围?

Ruby如何写入Tempfile

在 Windows 上安装特定的 Ruby on Rails 版本

Rails 5.1:未知 firstpos:NilClass - 问题重新加载应用程序

我收到在扫描下一个令牌时发现无法启动任何令牌的字符

如何为模型添加属性?

Heroku Postgres 错误:PGError:错误:关系组织不存在(ActiveRecord::StatementInvalid)

如何强制 RSpec 测试失败?

如何在 Rails 3 中订购包含的元素

Rails:如何在rails中使用dependent::destroy?

Ruby 中的类别名