6

我有两个应用程序,App1 和 App2。App1 向 App2 发布一个 JSON 有效负载,其中包括父对象和子对象的数据。如果父对象已经存在于 App2 中,那么我们更新父记录(如果有任何更改)并在 App2 中创建子记录。如果App2中不存在父对象,我们需要先创建它,然后再创建子对象,并将两者关联起来。现在我正在这样做:

class ChildController
  def create
    @child = Child.find_or_initialize_by_some_id(params[:child][:some_id])
    @child.parent = Parent.create_or_update(params[:parent])

    if @child.update_attributes(params[:child])
      do_something
    else
      render :json => @child.errors, :status => 500
    end
  end
end

像这样创建/更新父级感觉有些脏。有没有更好的方法来解决这个问题?谢谢!

4

2 回答 2

6

作为起点,您需要在模型中创建关联,然后包含accepts_nested_attributes_for在您的父级中。

使用在模型中创建的关联,您应该能够非常轻松地操纵关系,因为您会自动获得大量用于管理关系的方法。例如,您的 Parent/Child 模型可能看起来像这样:

在您的父模型中:

class Parent < ActiveRecord::Base
  has_many :children
  accepts_nested_attributes_for :children

在您的孩子模型中:

class Child < ActiveRecord::Base
  belongs_to :parent

然后,您应该能够像这样在控制器中建立关联:

def new
    @parent = Parent.children.build
end

def create
   @parent = Parent.children.build(params[:parent])
end

然后,nested_attributes 属性将允许您通过操作父对象来更新子对象的属性。

这是有关该主题的 Rails API:http: //api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

于 2012-10-19T19:02:07.660 回答
1

用于accept_nested_attributes_for处理父子关系。这里有一篇博文可以帮助你http://currentricity.wordpress.com/2011/09/04/the-definitive-guide-to-accepts_nested_attributes_for-a-model-in-rails-3 /

于 2012-10-19T18:24:06.593 回答