Rails和ActiveRecord:在has-many子元素上使用find-or-create时保存父对象

时间:2009-03-18 23:31:20

标签: ruby-on-rails activerecord

我正在尝试使用重复自动完成(由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 - 我没有什么可以搜索 - 这只是预先构建我认为的空对象 - 并且在作者被保存的时候它们已经是新对象了。或者我错了吗?

1 个答案:

答案 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包含的常规功能之一,我无法找到太多的信息,所以如果这样的话,请抱歉;)