Как использовать соединения в Rails с squeel

#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 . Обратите внимание, что одно из них является множественным, а другое — единственным. Здесь вы хотите использовать «единственную» версию, поскольку ассоциация «принадлежит_то».