Пытаюсь искать совпадение через 2 команды, перепробовал несколько синтаксиса, но ничего не помогает...
Соответствие модели:
class Match < ApplicationRecord
belongs_to :home, class_name: 'Team', foreign_key: :home_id
belongs_to :away, class_name: 'Team', foreign_key: :away_id
end
Команда модели:
class Team < ApplicationRecord
has_many :home_matches, class_name: 'Match', foreign_key: :home_id
has_many :away_matches, class_name: 'Match', foreign_key: :away_id
# Fields: name
end
Я пробовал что-то вроде этого:
Match.includes(:home, :away).where(homes: { name: 'Germany' }, aways: {name: 'China'})
Ошибка:
ActiveRecord::StatementInvalid (PG::UndefinedTable: ERROR: missing FROM-clause entry for table "homes")
Опция 1.
Проверьте запрос в Rails Console puts Match.joins(:home, :away).to_sql
.
Вы можете получить результат, например:
SELECT "matches".* FROM "matches" INNER JOIN "teams" ON "teams"."id" = "matches"."home_id" INNER JOIN "teams" "away_matches" ON "away_matches"."id" = "matches"."away_id"
Если это так, используйте запрос, например
Match.joins(:home, :away).where(teams: { name: 'Germany' }, away_matches: {name: 'China'})
Вариант 2.
Попробуйте запрос вроде
Match.where(home: Team.where(name: 'Germany'), away: Team.where(name: 'China'))
Вы также можете предварительно найти идентификаторы команд:
home_id = Team.find_by(name: 'Germany').id
away_id = Team.find_by(name: 'China').id
Match.where(home_id: home_id, away_id: away_id)
@BorisBRESCIANI Вариант 1 запроса зависит от того, что именно показывает puts Match.joins(:home, :away).to_sql
(это может зависеть от версии Rails).
Первый вариант
Match.joins(:home, :away).where(teams: { name: 'Germany' }, away_matches: {name: 'China'})
не работает, а второй вариант да