我正在尝试使用重复自动完成(由Pat Shaughnessy修改)创建一个复杂的表单(如railscast)来创建包含许多作者的文章(has-many:through)。只要我愿意在保存文章时总是创作新作者,我就能使用它。如何才能将我的关联作者记录仅在它们尚不存在时创建,并且只是在它们何时进行连接表更新?
我知道您可以使用find-or-create来获取父对象的结果,但我需要为在文章中调用@ article.save时保存的关联对象。
in articles.rb
before_save :remove_blank_authors
after_update :save_authors
def remove_blank_authors
authors.delete authors.select{ |author| author.fullname.blank?}
end
def new_author_attributes=(author_attributes)
author_attributes.each do |attributes|
authors.build(attributes)
end
end
def existing_author_attributes=(author_attributes)
authors.reject(&:new_record?).each do |author|
attributes = author_attributes[author.id.to_s]
if attributes
author.attributes = attributes
else
author.delete(author)
end
end
end
def save_authors
authors.each do |author|
author.save(false)
end
end
以及作者对我观点的部分看法:
<div class="author">
<% fields_for_author author do |f| %>
<%= error_messages_for :author, :object => author %>
<%= f.label :fullname, "Author Fullname:" %>
<%= f.text_field_with_auto_complete :author, :fullname, {}, {:method => :get } %>
<%= link_to_function "remove", "$(this).up('.author').remove()" %>
<% end %>
</div>
我正在使用Rails 2.2.2。
问题是我无法看到我可以在哪里使用find-or-create。在构建作者属性的那一点 - new_author_attributes - 我没有什么可以搜索 - 这只是预先构建我认为的空对象 - 并且在作者被保存的时候它们已经是新对象了。或者我错了吗?
答案 0 :(得分:2)
这取决于您使用的Rails版本,但您应该能够:
@article.authors.find_or_create_by_article_id(@author)
或
@author.articles.find_or_create_by_author_id(@article)
然后Rails“应该”为你填写详细信息......
要使用find_or_create
,您需要有条件来评估它。该条件(by_author_id部分)可以更改为文章模型中的任何列。
这是Rails包含的常规功能之一,我无法找到太多的信息,所以如果这样的话,请抱歉;)