前提
Rails初心者です。
ActiveRecordで名前空間を持ったモデルを参照する際、ActiveRecordが自動認識しているカラム名をInitializeなどで全体的に書き換えたいです。
言葉で伝わりづらいと思うので、コードで説明します。
前提
ruby
1# app/models/content.rb 2module Content 3 def self.table_name_prefix 4 'content_' 5 end 6end 7 8# app/models/content/post.rb 9class Content::Post < ApplicationRecord 10 belongs_to :category 11end 12 13# app/models/content/category.rb 14class Content::Category < ApplicationRecord 15 has_many :post 16end
上記のようなリレーションでjoinを実行した時、発行されるSQL
shell
1$ rails c 2irb(main):001:0>Content::Post.joins(:category).to_sql 3=> "SELECT `content_posts`.* FROM `content_posts` INNER JOIN `content_categories` ON `content_categories`.`id` = `content_posts`.`category_id`"
実現したいこと
今回行いたいのは次のようなテーブルで、リレーションを組みたいです。
ruby
1# db/Schema.rb 2create_table "content_posts", charset: "utf8mb4", force: :cascade do |t| 3 t.string :title, null: false, comment: 'タイトル' 4 t.string :content, null: false, comment: '内容' 5 ############## 問題点 ############## 6 t.bigint :content_category_id, null: false, comment: 'カテゴリID' 7 ############## 問題点 ############## 8 9 t.datetime :deleted_at, comment: "削除日時" 10 t.timestamps null: false, comment: "作成・更新日時" 11end 12 13create_table "content_categories", charset: "utf8mb4", force: :cascade do |t| 14 t.string :name, null: false, comment: 'カテゴリ名' 15 16 t.datetime :deleted_at, comment: "削除日時" 17 t.timestamps null: false, comment: "作成・更新日時" 18end
普通に下記のようにmodelでforeign keyを設定すればいいことなのですが…
ruby
1# app/models/content/post.rb 2class Content::Post < ApplicationRecord 3 belongs_to :category, foreign_key: 'content_category_id' # ここを自動で名前空間を見てPrefixをつけさせたい 4end
ActiveRecordで発行されるSQLの外部キー全体的に名前空間のPrefixをつけたいです。
InitializeだとModel書くたびに再起動しなくてはいけないので、できればapp/models/content.rb
などでオーバーライドする方法などがあればご教授いただけると幸いです。
補足情報(FW/ツールのバージョンなど)
Ruby on Rails 6
回答1件