我想编写一个方法来创建一堆几乎重复的记录,只需更改一个或两个参数。我将制作一个表单来控制这些参数,我只是想知道如何最好地编写该方法,以及在哪里保留它。
目前在我的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
虽然感觉不对。有更好的方法吗?
答案 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_many
或has_many ... through
。 Rails 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将获得正确填充的所有外键和(如果需要)关系表。