2014-03-13 93 views
0

我在下列情况下,考虑在现有的网站上创建,我有其中有许多设备,如这种模式用户:Ruby on Rails的,通过控制

has_many :devices, :through => :credits 

当我创建一个设备它创建一个信用,但是信用的一些属性是空的。我想知道是否有办法控制此信贷的创建,并确保为数据库创建的信贷中没有空值。

在此先感谢

回答

0

推荐:在您的信用数据库表 使用默认值。您可以使用数据库迁移来执行此操作。

class AddDefaultValuesToCredits < ActiveRecord::Migration 
    def change 
    change_column :credits, :value1, :boolean, default: false 
    change_column :credits, :value2, :string, default: 'words' 
    # change other columns 
    end 
end 

如果value1value2没有指定明确的价值,他们将分别默认为false'words'

备选:您也可以在您的信用模式中设置默认值。

class Credit < ActiveRecord::Base 
    after_initialize :set_values, unless: persisted? 

    # other model code 

    def set_values 
    if self.new_record? 
     self.value1 = false if self.value.nil? # initial boolean value 
     self.value2 ||= 'words' # initial string value 
     # other values 
    end 
    end 
+0

'after_initialize'被认为是hacky,因为该代码将在每个单独的'Credit'对象初始化时“运行”。我建议只进行数据库迁移。 –

+0

有用的信息瑞安。我想我会给出几个选项。我会更新我的答案以反映使用迁移的建议。 –

+0

@RyanBigg你是什么意思的“神奇”?我见过人们推荐after_initialize来设置默认值,因为即使你只是调用'Class.new',而不像数据库默认值 –