0

我有一个带有以下型号的 rails 应用程序:

class Product < ActiveRecord::Base
  has_many :stores, through: :product_store

  attr_accessible :name, :global_uuid
end

class ProductStore < ActiveRecord::Base
  attr_accessible :deleted, :product_id, :store_id, :global_uuid

  belongs_to :product
  belongs_to :store
end

由于此模型用于移动应用程序的 REST API,因此我在设备上远程创建对象,然后与此模型同步。发生这种情况时,我可能必须先创建一个ProductStore,然后再id设置一个 for Product。我知道我可以批量处理 API 请求并找到一些解决方法,但我已经决定global_uuid在移动应用程序中创建一个属性并进行同步。

我想知道的是如何在我的控制器中制作此代码:

def create
  @product_store = ProductStore.new(params[:product_store])
  ...
end

请注意,它将接收product_global_uuid参数而不是product_id参数,并使其正确填充模型。

我想我可以覆盖ProductStore#new,但我不确定这样做是否有任何后果。

4

1 回答 1

1

压倒.new一切是一项危险的业务,您不想参与其中。我会选择:

class ProductStore < ActiveRecord::Base
  attr_accessible :product_global_uuid
  attr_accessor :product_global_uuid

  belongs_to :product
  before_validation :attach_product_using_global_uuid, on: :create

  private
  def attach_product_using_global_uuid
    self.product = Product.find_by_global_uuid! @product_global_uuid
  end

end

拥有这些attr_accessors仅用于模型创建的人工有点混乱,并且您希望尽可能避免传入任何不是您正在创建的模型的直接属性的东西。但正如你所说,有各种考虑要平衡,这并不是世界上最糟糕的事情。

于 2013-05-30T08:57:56.893 回答