【Rails】関連に同一モデルを含む場合


これは何?

ユーザーのブロックリスト管理をしようとしたが、

ブロックリストを管理するモデルで二つのユーザーモデルを関連させなければならず、

その時に行き詰まってしまったのでここに記します。


何をしたいのか

user, user_block二つのモデルを利用して、

user_block内で「誰が」「誰を」ブロックしたのかを管理したい。


モデル作成

bundle exec rails g model User name:string

User

- name

bundle exec rails g model UserBlock from:references to:references

この時、migrationファイルにforeign_keyが自動的に付与されるが、そちらは削除する。

UserBlock

- from_id
- to_id


関連

モデルができたので、from_idto_idの二つをUserと関連させていく。


user.rb

has_many :user_blocks, foreign_key: :from_id



user_block.rb

belongs_to :from, class_name: 'User'

belongs_to :to, class_name: 'User'


呼び出し


users_controller.rb

before_action :set_user

def block
blocked = current_user.user_blocks.where(to: @user)
blocked || current_user.user_blocks.create(to: @user)
end

def unblock
current_user.user_blocks.where(to: @user).destroy
end

private
def set_user
user = User.find(params[:id])
end



参考

http://www.coma-tech.com/archives/223/