使用accepts_nested_attributes_for时创建或选择记录

时间:2012-02-24 19:44:08

标签: ruby-on-rails nested-attributes

我有以下内容:

app/models/order.rb

class Order < ActiveRecord::Base
  belongs_to :client    
  accepts_nested_attributes_for :client
end

app/models/client.rb

class Client < ActiveRecord::Base
    has_many :orders
end

当保存订单时,我想

  • 检查是否存在指定电子邮件的客户端
  • 如果存在,请选择订单
  • 如果没有,请使用提供的属性创建客户端,并将其链接到我的订单

我应该使用 before_save 作为客户端,或者实现它的最佳方法是什么?

感谢研究员!

========已解决! ======

2 个答案:

答案 0 :(得分:1)

我使用before_create作为订单,方法可能如下:

class Order < ActiveRecord::Base
  before_create :determine_client
  ...
  def determine_client
    if Client.exists?(:email => self.email_variable)
      self.client_id = Client.find_by_email(self.email_variable)
    else
      cur_client = Client.create!({ :email => self.email_variable })
      self.client_id = cur_client.id
    end
  end
end

这是基本的,但你可以从那里建立。希望这有帮助!

答案 1 :(得分:0)

感谢 Fishz 我玩了一遍,找到了以下解决方案:

class Order < ActiveRecord::Base

    before_validation :check_client_existance

    def check_client_existance
       if client = Client.find_by_email(self.client.email)
          self.client = client
       end 
    end

end

谢谢=)