ActiveAdminで複数のテーブルを作成して、has_manyやbelongs_toの関係付けをしたときに、新規作成の選択項目が、Client:0x0000558bc926bad8 のように表示されてしまうことがあります。
この原因と指定したカラムの値に変更する方法について解説しています。
問題と原因
外部キーで他のテーブルを指定したカラムをプルダウンで選ぶときに、その値ではなく、#<モデル名:0x0000558bc926bad8>といったオブジェクト名が表示されてしまう。
has_manyとbelongs_toの関係で、外部キーとなるテーブル(belongs_toで指定したテーブル)にnameがなく、変わりに、client_nameといった、他の名前を採用している場合に発生する。
対処法
ActiveAdminの書き方はformtasticという方法を採用しています。
formtasticはbelongs_to(references)を指定したカラムでは、対象のテーブルを操作するモデルをループして、name、to_s、value、titleなどのメソッドを自動で検索し表示します。
このため、1:多 の関係で 1 の側にあるテーブルを操作するためのモデルに次のようなメソッドを追記すれば、指定したカラムの値を返すことができます。
def name
return self.カラム名
end
実例
実際にファイルを編集するときにややこしいのが、通常のmodelファイルと、ActiveAdminの管理用のファイルが存在することです。
例えば、次のように、ClientモデルとProjectモデルがある場合、1:多 の関係は、クライアント毎にプロジェクトを管理すると、1はClient、多はProjectになります。
このとき、def name
を追記するファイルは、(3)app/admin/clients.rb です。
次のようにhas_manyの下にメソッドを追加すれば完了です。
class Client < ApplicationRecord
has_many :projects
def name
return self.client_name
end
end
こうすると、formtasticがbelongs_toの関係にある、Clientモデルを参照したときに、nameメソッドを実行して、client_nameのカラムを返すようになります。
これは、Clientテーブルの情報と一致しています。