hello-world.jp.net
webエンジニアのメモ。とりあえずやってみる。

[Rails]migrationで外部キーを設定する際に、参照先テーブルと異なるカラム名をつけたい場合

公開日時

migration時に外部キーを設定する場合、referencesを使いますが、参照先テーブルと異なるカラム名をつけたい場合はどうしようと思い調べてみました。

Usersテーブルのuser_idを、Likesテーブルのuser_idとtarget_user_idの外部キーとして設定したい場合のサンプル

  • migration
# db/migrate/xxxx_create_likes.rb

class CreateLike < ActiveRecord::Migration
  def up
    create_table :likes do |t|
      t.references :user
      t.integer :target_user_id, :null => false  # references を使わず指定

      t.timestamps
    end

    add_index :like, :user_id
    add_index :like, :target_user_id
  end

  def down
    drop_table :likes
  end
end
  • Userモデルのhas_manyにclass_name, foreign_keyを指定
# app/models/like.rb

class User < ActiveRecord::Base
  has_many :to_like_users, :class_name => "Like", :foreign_key => 'user_id' # :class_name, :foreign_keyを指定
  has_many :from_like_users, :class_name => "Like", :foreign_key => 'target_user_id'  # :class_name, :foreign_keyを指定
end
  • Likeモデルのbelong_toにclass_nameを指定
# app/models/like.rb

class Like < ActiveRecord::Base
  belongs_to :user
  belongs_to :target_user, :class_name => "User"  # :class_nameを指定
end

migrationファイルでは、target_user_idの設定にreferencesを使用せず、integerで指定

t.integer :target_user_id, :null => false

Likeモデルのbelongs_toのオプションにclass_nameでUserを指定することで、target_userを関連付けることができました。

belongs_to :target_user, :class_name => "User"

参考


Related #Rails

[rails]fragment cacheを使ってみる

fragment cacheを使うとテンプレートの一部を部分的にキャッシュすることが可能になります。

[ruby][rails]sidekiqのnamespaceにハマった

sidekiq3.0.1で確認。

wheneverの設定をcronに反映するコマンドメモ

Rubyでcronのバッチを作成したい場合に whenever をよく使うのですが、cron反映コマンドを毎回忘れて調べているので書き留めておきます。

rails4でアプリ作成後にDBを使わないようにしたい

あまりないケースではありますがメモ。