Rails:创建大量几乎重复的记录

时间:2013-08-27 01:16:30

标签: ruby-on-rails-3

我想编写一个方法来创建一堆几乎重复的记录,只需更改一个或两个参数。我将制作一个表单来控制这些参数,我只是想知道如何最好地编写该方法,以及在哪里保留它。

目前在我的document.rb我写过:

def self.publish(brand, components, template)
  brand.users.each do |user|
    Document.create(:component_ids => components, :message => 'Message.', :template_id => template.id, :user_id => user.id)
  end
end

虽然感觉不对。有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

如果您的安全模型允许通过模型中attr_accessible中的提及批量分配所有这些字段,则此代码很好。如果没有,那么最好使用create的块形式。此外,如果Document,Template和User是ActiveRecord实例,您应该让Rails管理ID的详细信息。

def self.publish(brand, components, template)
  brand.users.each do |user|
    Document.create do |doc|
      doc.component_ids = components, 
      doc.message 'Message.', 
      doc.template = template, 
      doc.user = user
    end
  end
end

最后需要注意的是,component_ids必须序列化才能存储列表。这可能是您的模型设计中的一个缺陷。更好的方法是(可能)指定组件belongs_to用户以及用户has_many组件。即组件包含用户的外键。如果组件也必须属于许多用户,那么您需要has_and_belongs_to_manyhas_many ... throughRails guide on relations更详细地描述了这一切。

设置正确的关系后,代码将变为:

def self.publish(brand, components, template)
  brand.users.each do |user|
    Document.create do |doc|
      doc.components = components,  # Components is now a list of active records.
      doc.message 'Message.', 
      doc.template = template, 
      doc.user = user
    end
  end
end

生成的SQL将获得正确填充的所有外键和(如果需要)关系表。