2017-07-25 9 views
0

私のキャラクターモデルにiconfolioを追加しました。各文字はhas_one :iconfolioです。has_one関係のカラム行を更新するレール

class CreateIconfolios < ActiveRecord::Migration 
    def change 
    create_table :iconfolios do |t| 
     t.integer :character_id 

     t.string :icon_url 

     t.timestamps null: false 
    end 
    add_index :iconfolios, :character_id 
    end 
end 

iconfolioクラス:

class Iconfolio < ActiveRecord::Base 

    belongs_to :character 

    validates :character_id, presence: true 

    before_create do 
    self.icon_url = '/assets/icon1.png' 
    end 

end 
iconfolio.rb

ここ

character.rb

has_one :iconfolio, dependent: :destroy 
accepts_nested_attributes_for :iconfolio 
before_validation do 
self.create_iconfolio unless iconfolio 
end 

は、マイグレーションファイルです

まず、characterごとにiconfolioが作成されていることを確認するにはどうすればよいですか?

第2に、character_id列のすべての行を更新するにはどうすればよいですか? レコードごとにcharacter_idの値が異なります。 icon_url列の更新は、コンソールで行うことができます

Iconfolio.all.update_all(person_normal_icon_url: '/assets/icon1.png') 

答えて

1

これを行う最も簡単な方法は、あなたがIconfolioで行ったように、デフォルトのテンプレートiconfolioとupdate_all文字レコードを作成することです。データベースがまだ大規模でない場合は、Character.allを反復して、それらにiconfolioを割り当てることができます。行ごとにオブジェクトをインスタンス化し、update_allよりもはるかに時間がかかることに注意してください。インスタンス化の利点は、検証をバイパスしないことです。

Character.all.find_each do |char| 
    if char.iconfolio.blank? 
      Iconfolio.create(character_id: char.id, whatever_other_params: put_here) 
    end 
    end 

が続いて作成し、将来の新しい文字のiconfolioを割り当てキャラクタモデルでafter_createを行います。各レコードを反復処理し、見つけたかのような文字あたりiconfolioを作成し、あなたのコンソールでブロックを書きます。ような何か:

追記として
after_create :make_an_iconfolio 

def make_an_iconfolio 
    Iconfolio.create(character_id: self.id, other params here) 
end 

、あなたのCREATE_TABLE移行中関係を追加するためのRailsの方法は次のとおりです。

def change 
    create_table :iconfolios do |t| 
     t.belongs_to :character, index: true 

これだけで、それは関係だと、あなたや他の人にそれがより明確になり、保存されます索引作成からの余分なコード行。

関連する問題