#ruby-on-rails #activerecord #squeel
#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. Попробуйте использовать единственное
SonyAlarmLog
число, потому что это имя вашей модели, а не множественноеSonyAlarmLogs
число .2. @vee извините за опечатки, я исправил это.
3.
:sony_alarm_tests
В вашемjoins
также должно быть единственное:sony_alarm_test
число, которое естьbelongs_to :sony_alarm_test
в вашейSonyAlarmLog
модели.4. @vee Спасибо за вашу помощь, вы знаете, как использовать предложение where с объединениями
5. Пожалуйста, смотрите мой ответ ниже. Необходимо было внести несколько изменений в синтаксис (основываясь на связанной документации squeel).
Ответ №1:
Продолжение комментариев… Согласно документации squeel, вы можете написать свой запрос как:
SonyAlarmLog.joins{:sony_alarm_test}.
where{
(name =~ event_name) amp;
(utc_time.gt (my{utc_time} TIME_CORRECTION)) amp;
(sony_alarm_test.round.eq(my{sony_alarm_test.round})) amp;
(sony_alarm_test.ip =~ my{sony_alarm_test.ip}) amp;
(sony_alarm_test.firmware_version =~ my{sony_alarm_test.firmware_version})
}
Причина, по которой вы получаете ошибку, вероятно, из-за либо sony_alarm_tests.firmware_version
или sony_alam_test.firmware_version
. Обратите внимание, что одно из них является множественным, а другое — единственным. Здесь вы хотите использовать «единственную» версию, поскольку ассоциация «принадлежит_то».