2013-11-20 3 views
0

У меня есть следующая связь базы данных:Сделать ActiveRecord запроса на основе полей в связанных моделях

Entry 
has_one :math_test_before, class_name: "MathTest" 
has_one :math_test_after, class_name: "MathTest" 

Я хочу, чтобы просмотреть каждую запись, в которой entry.math_test_before.score > entry.math_test_after.score

Как я могу сделать запрос ActiveRecord, который позволяет мне ссылаться на математические оценки каждой записи и сравнивать их?

+0

Вы можете присоединяться к предложениям() или предпочитаете писать необработанный sql? – Chandranshu

ответ

0

В конце концов я дал каждому объекту свою собственную таблицу базы данных, используя несколько наследований таблицы.

0

Согласно the pastebin предоставленной О.П., следующее утверждение:

Entry.joins(:math_test_before, :math_test_after) 
    .where('math_test_before.score > math_test_after.score').all 

произвел следующий SQL-запрос:

Entry Load (0.3ms) SELECT "entries".* FROM "entries" INNER JOIN "math_tests" ON "math_tests"."entry_id" = "entries"."id" INNER JOIN "math_tests" "math_test_afters_entries" ON "math_test_afters_entries"."entry_id" = "entries"."id" WHERE (math_test_before.score > math_test_after.score) 

Дать правильное утверждение теперь тривиально. Вот он:

Entry.joins(:math_test_before, :math_test_after) 
    .where('math_tests.score > math_test_afters_entries.score').all 

Однако при запуске этого запроса вы не получите желаемых результатов. Это связано с тем, что ваши ассоциации не были настроены должным образом. Посмотрите на свои журналы: таблица math_tests соединяется с таблицей записей с одним и тем же внешним ключом дважды, что означает, что тот же тест будет действовать как перед, так и после теста.

Вам необходимо внести некоторые изменения в настройку вашей ассоциации. Прежде всего, ваша запись должна belong_to в два MathTest экземпляры, как это:

class Entry < ActiveRecord::Base 
    belongs_to :math_test_before, :class_name => 'MathTest' 
    belongs_to :math_test_after, :class_name => 'MathTest' 
end 

Вам также необходимо добавить столбцы с именем math_test_before_id и math_test_after_id таблицу записей путем создания соответствующей миграции и запуска rake db:migrate. После этого отредактируйте ваш класс MathTest следующим образом:

class MathTest < ActiveRecord::Base 
    has_one :before_entry, :class_name => 'Entry', :foreign_key => 'math_test_before_id' 
    has_one :after_entry, :class_name => 'Entry', :foreign_key => 'math_test_after_id' 
end 

Предоставленный запрос должен работать тогда.


ПОЖИЛЫХ ПОПЫТКИ: Первая и вторая попытка, описанная ниже, чтобы написать этот запрос не удались. Они сохраняются здесь для записи, чтобы другие не тратили время на это.

Что-то, как это должно работать:

Entry.joins(:math_test_before, :math_test_after) 
.where('math_test_before.score > math_test_after.score').all 

Просьба представить выход выше заявление, даже если он не даст вам желаемый результат. Я опасаюсь только потому, что мне никогда не приходилось использовать атрибут class_name ассоциации has_one.

ОБНОВЛЕНИЕ Посмотрите на этот ответ: https://stackoverflow.com/a/8588520/563535. Согласно плакату, сгенерированное псевдоним - <assoc_name>_<entity_name_plural>. Таким образом, ваш запрос должен, вероятно, использовать math_test_before_entries.score > math_test_after_entries.score. Получение взгляда на сгенерированный оператор поможет нам уловить это дальше.

+0

В обеих версиях запроса, которые вы явно предлагаете, я получаю ошибки, перечисленные в этом пасти (оба с 'math_test_before.score' и' math_test_before_entries.score': http://pastie.org/private/fatvjjmt8wz9yyfxtht8eq. Я также попытался используйте модифицированную версию правильного ответа в сообщении StackOverflow, с которым вы связались, но я не могу понять правильный синтаксис для создания двух соединений. Моя попытка также находится в пасте. –

+0

@EricBaldwin - Как-то я пропустил ваш комментарий до сих пор. на это прямо сейчас. – Chandranshu

+0

Это хорошая идея, и я ценю вашу помощь. Однако для модели данных, которую я хочу, есть math_tests, принадлежащие записям. –

Смежные вопросы