2013-05-17 44 views
2

每当我在rails中创建新公司记录时,我需要在该公司添加一些默认(空白)联系人记录。前台,接待,人力资源,IT等等......除了名称外,他们不会有任何数据,只是稍后用户填写的占位符。Rails默认数据

因此,我的公司模式has_many联系人,并联系belongs_to公司。联系人记录是静态的,并且对于每个新增公司都是相同的,但我需要预先使用数据填充联系人表,所以我的用户不需要。

我已经阅读了很多关于种子数据库的知识,但每次用户动态创建公司时都无法使用终端,并且需要将其动态绑定到该公司,记录不是不可知。播种似乎不是正确的。这应该怎么做?

+0

作为创建公司的一部分? –

+0

是的,所以创建公司时,也创建了从属联系人记录。 – rncrtr

+0

对 - 我是说做它作为创建公司的一部分。 –

回答

1

after_createCompany回调模型?

水木清华这样的:

class Company < ActiveRecord::Base 
    has_many :contacts 

    after_create :add_contacts 

    def add_contacts 
    contacts.create(name: "Some name", phone: "...", ....) 
    end 
end 
+0

太棒了,但这里的#代码是我不知道该怎么做的。如果它是由用户输入的形式,我明白了,但在代码中呢?创建一个新的联系人对象,将attrs分配给那个?这是我不清楚的地方。 – rncrtr

+2

@mcrtr它与表单没有什么不同,而不是使用参数,你使用属性,比如'contacts = [Contact.create(name:'Receiving'),Contact.create(name:'Front Desk'),..尽管我同意Tilo的意见,即将默认联系人与公司本身隔离 - 如果这样做是合理的,例如,不依赖于公司类型或某事。 –

+0

@mctr增加了一些例子。 @Dave Newton - 最好使用contacts.create而不是Contact.create来设置关联。 – Bob

3

你应该使用before_save过滤器,它检查是否一个属性是空的,否则它设置为默认。

使用before_save将在稍后防范删除。

但是,请注意只对永远不会为空的字段执行此操作。

class Company < ActiveRecord::Base 
    has_many :contacts 

    before_save :add_defaults 

    def add_defaults 
    contacts ||= Contact.default_list # this only sets it if it's nil 
    # you can implement Contact#default_list as a method, or as a scope in the contacts model 
    end 
end 
0

虽然理论上存在用于生成测试数据,所述FactoryGirl宝石是用于此目的是非常有用的。将其与此处提到的after_save方法结合使用,您将有一个集中定义空白记录的好地方。