2017-07-25 194 views
0

我已將iconfolio添加到我的人物模型中。每個字符has_one :iconfolioRails更新has_one關係的列行

character.rb

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

這裏是遷移文件:

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類:

iconfolio.rb

class Iconfolio < ActiveRecord::Base 

    belongs_to :character 

    validates :character_id, presence: true 

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

end 

首先,如何確保爲每個character創建了iconfolio

其次,如何更新character_id列中的所有行?每個iconfolio記錄的character_id值不同。更新icon_url列可以在控制檯來完成:

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

回答

1

要做到這一點,最簡單的方法是,你Iconfolio沒有創建一個默認模板iconfolio和update_all字符記錄。如果你的數據庫不是很大,你可以遍歷Character.all併爲它們分配一個圖標組合。被建議這將實例化每行一個對象,並且比update_all耗時更多。實例化它們的好處是它不會繞過你的驗證。寫在控制檯塊,通過每個記錄進行迭代,並尋找或創建像每個字符的iconfolio:

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。喜歡的東西:

after_create :make_an_iconfolio 

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

一點題外話,Rails的方式,在你的CREATE_TABLE遷移添加的關係是:

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

這只是使得它更清楚你和其他人,這是一個關係並保存來自索引的額外一行代碼。