如何在带有 squeel 的 Rails 中使用连接
Posted
技术标签:
【中文标题】如何在带有 squeel 的 Rails 中使用连接【英文标题】:How to use joins in Rails with squeel 【发布时间】:2014-06-27 03:35:56 【问题描述】:如何使用join或其他方式让我使用where查询来比较另一个模型中的其他条件?
模型关系
class SonyAlarmLog < ActiveRecord::Base
belongs_to :sony_alarm_test
class SonyAlarmTest < ActiveRecord::Base
has_many :sony_alarm_bugs, :dependent => :destroy
它有效,但返回SonyAlarmTest
的列,我想要sony_alarm_logs
的列
SonyAlarmTest.joins:sony_alarm_logs
.where sony_alarm_logs.name =~ event_name
失败,得到ActiveRecord::ConfigurationError: Association named 'sony_alarm_tests' was not found on SonyAlarmLog; perhaps you misspelled it?
错误
SonyAlarmLog.joins(:sony_alarm_tests)
.where name =~ event_name
更新(修正:它应该使用单数名称)
但仍然出现ActiveModel::MissingAttributeError: missing attribute: firmware_version
错误
我认为这可能是对 squeel 语法的误用?
SonyAlarmLog.joins(:sony_alarm_test)
.where name =~ event_name
.where utc_time.gt (myutc_time + TIME_CORRECTION)
.where sony_alarm_tests.round.eq(mysony_alarm_test.round)
.where sony_alarm_tests.ip =~ mysony_alarm_test.ip
.where sony_alarm_tests.firmware_version =~ mysony_alarm_test.firmware_version
【问题讨论】:
尝试使用单数SonyAlarmLog
,因为那是您的型号名称,而不是复数 SonyAlarmLogs
。
@vee 抱歉打错了,我更正了。
joins
中的:sony_alarm_tests
也需要是单数:sony_alarm_test
,即SonyAlarmLog
模型中的belongs_to :sony_alarm_test
。
@vee 感谢您的帮助,您知道如何在连接中使用 where 子句
请看下面我的回答。需要对语法进行一些更改(基于 squeel 的链接文档)。
【参考方案1】:
跟进 cmets... 根据 squeel 的文档,您可以将查询编写为:
SonyAlarmLog.joins:sony_alarm_test.
where
(name =~ event_name) &
(utc_time.gt (myutc_time + TIME_CORRECTION)) &
(sony_alarm_test.round.eq(mysony_alarm_test.round)) &
(sony_alarm_test.ip =~ mysony_alarm_test.ip) &
(sony_alarm_test.firmware_version =~ mysony_alarm_test.firmware_version)
您收到错误的原因可能是sony_alarm_tests.firmware_version
或sony_alam_test.firmware_version
。注意其中一个是复数,另一个是单数。您想在这里使用“singular”版本,因为关联是“belongs_to”。
【讨论】:
以上是关于如何在带有 squeel 的 Rails 中使用连接的主要内容,如果未能解决你的问题,请参考以下文章
在 Ruby on Rails 4 中使用 Active Record 或 Squeel Gem 重写 SQL 查询
Rails,ActiveRecord,Squeel:检查数组中是不是存在值