【问题标题】:Exclude active record entries based on another active record attribute根据另一个活动记录属性排除活动记录条目
【发布时间】:2020-01-26 13:24:18
【问题描述】:

(请随意将标题更改为更合适的标题)

我正在使用 Ruby on Rails,我有两个模型集:

  • 页面
  • 商店

  • 页面has_many 存储。

  • 商店具有属性status_nbr,范围为1-5。

例如,第 1 页可能有 5 家商店,其中两家有status_nbr = 1,其中三家有status_nbr = 3

我想运行一个查询来查找所有 no 商店且 status_nbr = 1 的页面。换句话说,缺少 status_nbr = 1 的商店的页面。我该怎么做?我认为这可以通过一些巧妙的连接来完成?

至于现在我运行一个循环:

ok_list = []
Page.all.each do |page|
  ok_list << page.id unless page.stores.where(:status_nbr => 1).blank?
end
@pages = Page.where(:id => ok)

这是非常糟糕/缓慢的编程。

编辑:这不是所提到的问题的重复问题。我的模型依赖于另一个模型和另一个模型的属性。

【问题讨论】:

  • 这里(重要的)区别在于这也与另一个模型有关。你指的问题是属性是否在同一个模型中!

标签: ruby-on-rails ruby ruby-on-rails-3 join activerecord


【解决方案1】:

这应该可行。

Page.joins(:store).where.not(store: { status_nbr: 1}).uniq

【讨论】:

  • 这个答案不起作用,原因与第一个相同(现在已删除)。首先,它需要一个 .distinct 才能接收唯一的页面。尽管如此,它仍然显示带有 status_nbr = 1 的商店的页面。我通过循环结果确认并检查 status_nbr == 1 的商店。
  • 我已经制作并编辑了,这些值也是存储为整数还是字符串?
  • 这至少应该是 Page.joins(:stores).where.not(stores: { status_nbr: 1}).uniq ,虽然它很优雅,但它不起作用。如果我做 Page.joins(:stores).where.not(stores: { status_nbr: 1}).uniq.each 做 |page| puts page.stores.where(:status_nbr => 1).count end 它仍然显示至少一些商店有 status_nbr = 1 的页面。所以,谢谢,但不幸的是这不起作用。我怀疑是否需要另一种类型的加入,但我不知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-05
  • 1970-01-01
  • 2010-12-18
相关资源
最近更新 更多