2

短縮版:

これは、team.tournaments では機能しますが、tournaments.teams では機能しません。それは私に与えます:

  <main>'irb(main):117:0> tournament.teams << team
(0.1ms)  begin transaction
(0.0ms)  commit transaction
Team Load (0.2ms)  SELECT "teams".* FROM "teams" WHERE "teams"."tournament_id" = 1
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: teams.tournament_id: SELECT "teams".* FROM "teams"  WHERE "teams"."tournament_id" = 1

長いバージョン:

チームとトーナメントの間に多対多の関係を築きたいと考えています。以下に示す最初の部分で行われる結合テーブルを介してこれを行う必要があることを理解しています。そこから、チーム/トーナメント モデルにそれぞれ示されている関連付けを追加する必要があります。

    class TeamTournamentJoinAttempt3 < ActiveRecord::Migration
  def up
    create_table :teams_tournaments, :id => false do |t|
        t.integer "tournament_id"
        t.integer "team_id"
    end
    add_index :teams_tournaments, ["tournament_id", "team_id"]
  end

  def down
    drop_table :teams_tournaments
  end
end

トーナメントモデル:

class Tournament < ActiveRecord::Base
  has_and_belongs_to_many :teams
end

チーム モデル:

class Team < ActiveRecord::Base
  has_and_belongs_to_many :tournaments
end

これで、次のコマンドを使用して、Rails コンソールでチームとトーナメントを見つけることができます。

tournament = Tournaments.find(1)
team = Teams.find(1)

次に、次を使用して 2 つの関係を作成できます。

team.tournaments << tournament
    (0.1ms)  begin transaction
    (0.3ms)  INSERT INTO "teams_tournaments" ("team_id", "tournament_id") VALUES (1, 1)
    (123.1ms)  commit transaction

そしてブーム、私はすべてがうまくいっていると思います。ただし、別の方法 ( ) に移動しようとするとtournament.teams << team、次のエラーが表示されて機能しません。

tournament.teams << team
    (0.1ms)  begin transaction
    (0.0ms)  commit transaction
    Team Load (0.2ms)  SELECT "teams".* FROM "teams" WHERE "teams"."tournament_id" = 1
    ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: teams.tournament_id: SELECT "teams".* FROM "teams"  WHERE "teams"."tournament_id" = 1
4

1 に答える 1

0

または関連付けを実験した後、Ruby コンソールでTeamTournamentJoinAttempt3使用しないことに賭けているのを見てください。reload!belongs_tohas_one

于 2013-02-16T08:40:42.790 に答える