Form_forを使って子のインスタンス作成の際、入力値が親の要素だった場合、そこから親のidだけを子のインスタンスとして保存したいです

投稿者: Anonymous

Associationの関係が以下のようになってます。ここで

company has_many trades
trade belongs to company

companyのテーブル
create_table :companies do |t|
t.string :company_name
t.string :company_address

tradeのテーブル
create_table :trades do |t|
t.references :user, foreign_key: true
t.references :company, foreign_key: true

views/trades/newで @tradeを form_forを使ってユーザーに入力してもらうのですが、その際にユーザーが入力してもらう値が親のインスタンスであるcompany_nameになります。このようなとき、どうすれば、入力されたcompany_nameが@tradeに保存される時にcompany.idとして保存できるのでしょうか?

解決

コントローラーで解決する

#フォームではtext_field_tag(:company_name)

company = Company.where(company_name: params[:company_name]).first
@trade.company = company

company_nameをモデルの属性にしてモデルの保存時に解決する

#フォームではf.text_field(:company_name)

attr_accessor :company_name

before_save :set_company

def set_company
  company = Company.where(company_name: company_name).first
end

カラムをcompany_idではなくcompany_nameにして、それで関連づけする

#migration
create_table trades do |t|
  t.string :company_name
end

add_foreign_key(:trades, :companies, foreign_key: :company_name, primary_key: :company_name)

#model
belongs_to :company, foreign_key: :company_name, primary_key: :company_name

Companyをcollection_selectで選択させる

こんなところでしょうか。エラーチェック、バリデーション、制約とかは省略してます。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *