Rails принадлежит имя_класса с правильными внешними ключами? - PullRequest
0 голосов
/ 08 февраля 2011

У меня есть расписание матчей и база данных команд для показа футбольных матчей.В настоящее время я могу просматривать все приборы (индекс и шоу ..) и все команды (только индекс).

create_table "fixtures", :force => true do |t|
    t.integer  "home_id"
    t.integer  "away_id"
    t.date     "date"
    ...

  create_table "teams", :force => true do |t|
    t.string   "name"
    ...

Ниже представлены мои модели приборов и команд;

class Fixture < ActiveRecord::Base
  belongs_to :home, :class_name => 'Team'
  belongs_to :away, :class_name => 'Team'
  ...
class Team < ActiveRecord::Base
  has_many :fixtures
  ...

Я получаюследующая ошибка при попытке отобразить команды фикстур на странице 'groups # show'

Processing by TeamsController#show as HTML
  Parameters: {"id"=>"3"}
  Team Load (0.4ms)  SELECT "teams".* FROM "teams" WHERE ("teams"."id" = 3) LIMIT 1
  Fixture Load (0.3ms)  SELECT "fixtures".* FROM "fixtures"
  Fixture Load (0.3ms)  SELECT "fixtures".* FROM "fixtures" WHERE ("fixtures".team_id = 3)
SQLite3::SQLException: no such column: fixtures.team_id: SELECT "fixtures".* FROM "fixtures" WHERE ("fixtures".team_id = 3)

Я понимаю, что ошибка говорит о том, что она ищет team_id в фикстурах, но ее нет, так как у меня есть home_id иaway_id, поскольку каждый прибор всегда содержит две команды, так как мне построить поиск, чтобы отобразить отдельные команды команд?

1 Ответ

0 голосов
/ 08 февраля 2011

Хотелось бы, чтобы был хороший способ сделать это, но на самом деле это не так.Вероятно, лучшие обходные пути:

  1. Чтобы иметь два has_many s, :home_fixtures и :away_fixtures, а затем метод fixtures, который возвращает объединение двух (см. этот вопрос для получения более подробной информации).
  2. Чтобы вообще пропустить has_many s и просто написать метод fixtures, который дает вам то, что вы хотите, без фактической установки и установки отношений ActiveRecord.

Вот так (Rails 2.3-Style):

def fixtures
    return Fixture.all(:conditions => ['away_id = :id OR home_id = :id', {:id => self.id}])
end

Надеюсь, это поможет!

...