2017-07-25 70 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 

这只是使得它更清楚你和其他人,这是一个关系并保存来自索引的额外一行代码。