1. ホーム
  2. ruby-on-rails

[解決済み] Rails find_or_create_by 複数の属性?

2022-04-13 02:32:03

質問

active-recordには、find_or_create_byという便利な動的属性があります。

Model.find_or_create_by_<attribute>(:<attribute> => "")

しかし、複数の属性でfind_or_createする必要がある場合はどうしたらよいでしょうか?

例えば、GroupMemberというグループとメンバーのM:Mリレーションシップを扱うモデルがあるとします。member_id = 4 のインスタンスをたくさん持つことができますが、member_id = 4 と group_id = 7 のインスタンスは1つも欲しくはないです。

GroupMember.find_or_create(:member_id => 4, :group_id => 7)

もっと良い処理方法があるかもしれませんが、find_or_createのアイデアの利便性が気に入っています。

どのように解決するのですか?

複数の属性は and :

GroupMember.find_or_create_by_member_id_and_group_id(4, 7)

(使用 find_or_initialize_by すぐにレコードを保存しない場合)

編集する。 上記の方法はRails 4で非推奨となり、新しい方法となります。

GroupMember.where(:member_id => 4, :group_id => 7).first_or_create

GroupMember.where(:member_id => 4, :group_id => 7).first_or_initialize

2を編集します。 これらは、属性に応じたものだけで、すべてレールに織り込まれているわけではありません。

https://github.com/rails/rails/blob/4-2-stable/guides/source/active_record_querying.md

GroupMember.find_or_create_by_member_id_and_group_id(4, 7)

になった

GroupMember.find_or_create_by(member_id: 4, group_id: 7)