如何在带有 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_versionsony_alam_test.firmware_version。注意其中一个是复数,另一个是单数。您想在这里使用“singular”版本,因为关联是“belongs_to”。

【讨论】:

以上是关于如何在带有 squeel 的 Rails 中使用连接的主要内容,如果未能解决你的问题,请参考以下文章

在 Ruby on Rails 4 中使用 Active Record 或 Squeel Gem 重写 SQL 查询

Rails,ActiveRecord,Squeel:检查数组中是不是存在值

ruby on rails 连接条件(带 squeel)

需要帮助重新编写一些最初使用名为 Squeel 的 gem 编写的 Rails DB 查询,具有有效的 SQL

Squeel 子查询

使用 Squeel 时的参数数量错误