Mymt658
@Mymt658

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Ruby on Rails 他のテーブルを参照してIDを取得して、外部キーとしてデータを挿入したい

解決したいこと

ここに解決したい内容を記載してください。

CinemasとSchedulesと二つのテーブルがあり、
1対Nの関係のでCinemasのidをScheduleのcinema_idで取得したいと考えています。

しかしコンソール上で確認してもnillのままでviewでも表示されません。

cinema.rb

cinema.rb

  has_many :schedules, dependent: :destroy
  has_many :active_relationships, class_name:  "Schedule",
            foreign_key: "cinema_id",
            dependent: :destroy
schedule.rb

belongs_to :cinema, class_name: "Cinema"
schema.rb
def greet
  create_table "cinemas", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
    t.string "name"
    t.string "image"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.boolean "admin", default: false
    t.date "year"
    t.text "description"
    t.boolean "is_showing"
  end

  create_table "schedules", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
    t.bigint "cinema_id"
    t.time "start_time"
    t.time "end_time"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.index ["cinema_id"], name: "index_schedules_on_cinema_id"
  end
end

自分で試したこと

ここに問題・エラーに対して試したことを記載してください。

下記サイトを参考にdbを作り直したりしましたが、うまくいくことはありませんでした。

よろしくいお願いします。

0

1Answer

schema.rbにdef greetとなっているのは自分でschema.rbを書いたからですか?

schema.rb
ActiveRecord::Schema.define(version: 2021_....) do

  create_table "...", force: :cascade do |t|
    ...
    ...
  end

通常railsのmigrationを通すので、自分でこのファイルを書くことはなく、こういう風に自動生成されるはずですが...

cinema.rb

  # これで既にCinema:Schedule = 1:N
  has_many :schedules, dependent: :destroy 
  # これは何をしようとしていますか?
  has_many :active_relationships, class_name:  "Schedule",
            foreign_key: "cinema_id",
            dependent: :destroy

schedule.rb

# belongs_to :cinema, class_name: "Cinema"
belongs_to :cinema

activerecordがbelongs_toの指定モデル名から理解してくれるので、class_nameはこの場合は書く必要はないです。

1対Nの関係のでCinemasのidをScheduleのcinema_idで取得したいと考えています。

$ rails c

> s = Schedule.first
> puts s
> puts s.cinema_id # schedule -> cinema_id(1テーブルのみのアクセス)
> puts s.cinema.id # schedule -> cinema -> id (同じだけど2テーブルにアクセスする)

scheduleからcinema_idを見たいだけならこれで良いと思います。

0Like

Comments

  1. @Mymt658

    Questioner

    御回答ありがとうございます

    ・schema.rbにdef greetとなっているのは自分でschema.rbを書いたからですか?
      申し訳ありません、qiitaの下書きが残っていたようですが、質問とは無関係です。

    コンソールで確認まで当方も行いましたが、カラムは作成されていますが
    値がnilの状態でしたので質問しました。

    cinema.rb、schedule.rbに必要のないコードを記述しているようですが、
    ・modelファイルに自動生成されなかった
    ・各ファイルにhas_many , belongs_toのみ記述しコンソールで確認しましたがcinema_idカラムの値がnilのままでしたので、何か記述が足りない?と思い余計なコードを追加してしまいました

Your answer might help someone💌