38207


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として保存できるのでしょうか？


CC BY-SA 3.0
2017-09-26T04:59:52.357
38197
2017-09-26T09:04:26.243
25481
question
ruby-on-rails
Form_forを使って子のインスタンス作成の際、入力値が親の要素だった場合、そこから親のidだけを子のインスタンスとして保存したいです


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

[code]

    #フォームではtext_field_tag(:company_name)
    
    company = Company.where(company_name: params[:company_name]).first
    @trade.company = company
    
[/code]

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

[code]

    #フォームでは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
    
[/code]

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

[code]

    #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
    
[/code]

Companyを`collection_select`で選択させる

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


CC BY-SA 3.0
2017-09-26T08:38:38.850
38207
2017-09-26T09:04:26.243
2017-09-26T09:04:26.243
5793
5793
38197
answer