如何在Rails中使用带有squeel的连接

时间:2014-06-27 03:35:57

标签: ruby-on-rails activerecord squeel

如何使用联接或其他方式让我使用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 (my{utc_time} + TIME_CORRECTION) }
.where{ sony_alarm_tests.round.eq(my{sony_alarm_test.round}) }
.where{ sony_alarm_tests.ip =~ my{sony_alarm_test.ip} }                            
.where{ sony_alarm_tests.firmware_version =~ my{sony_alarm_test.firmware_version} }

1 个答案:

答案 0 :(得分:0)

跟进评论......根据squeel的文档,您可以将查询编写为:

SonyAlarmLog.joins{:sony_alarm_test}.
  where{ 
    (name =~ event_name) & 
    (utc_time.gt (my{utc_time} + TIME_CORRECTION)) & 
    (sony_alarm_test.round.eq(my{sony_alarm_test.round})) &
    (sony_alarm_test.ip =~ my{sony_alarm_test.ip}) &                            
    (sony_alarm_test.firmware_version =~ my{sony_alarm_test.firmware_version})
  }

您收到错误的原因可能是sony_alarm_tests.firmware_versionsony_alam_test.firmware_version。注意其中一个是复数,另一个是单数。你想要使用&#34; singular&#34;这里的版本是&#34; belongs_to&#34;。