gpt4 book ai didi

mysql - Rails 4 - 如何通过 has_many 关联与同一列上的多个条件查询集合?

转载 作者:行者123 更新时间:2023-11-29 07:20:33 25 4
gpt4 key购买 nike

这里有一些背景 - 假设我有以下关系:

class Session < ActiveRecord::Base
has_many :events
end

class Event < ActiveRecord::Base
belongs_to :session
has_many :event_attributes
end

class EventAttribute< ActiveRecord::Base
belongs_to :event
end

这是事件属性表的迁移:

create_table  :event_attributes do |t|
t.string :key
t.string :value
t.integer :event_id
end

现在的问题 - 如果我拥有属于一个 session 的所有事件,如下所示:

session = Session.find(1)
events = session.events

如何查找具有以下特征的事件:

一个 event_attribute,其中键列是“name”,值列是“Bill”

并且

一个 event_attribute,其中键列是“城市”,值列是“西雅图”

我尝试过这样的事情:

events.includes(:event_attributes)
.where(event_attributes: { key: 'name', value: 'Bill' })
.where(event_attributes: { key: 'city', value: 'Seattle' })

这提供了 0 个结果。如果我查询单个 where 条件,我会得到预期的结果,我只是不确定如何在 has_many 关联上搜索具有多个条件的集合。

最佳答案

您需要在 where 子句中使用 a AND b OR c AND d。Rails 4 没有内置对 OR 的支持,因此您需要使用 SQL 字符串。

sql = <<-EOS
event_attributes.key = 'name' AND event_attributes.value = 'Bill'
OR
event_attributes.key = 'city' AND event_attributes.value = 'Seattle'
EOS

events = Event.joins(:session, :event_attributes)
.where(session: { id: 1 })
.where(sql)
.group('event_attributes.id')
.having("count(*) = ?", 2)

如果您需要动态构建查询,您可能需要研究 Arel API(ActiveRecord 使用它来构建 SQL)。

尽管我个人会采取简单的方法,只是将列添加到事件表中,因为键/值表是真正的 PITA。

关于mysql - Rails 4 - 如何通过 has_many 关联与同一列上的多个条件查询集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36301498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com