如何从ActiveRecord实例中获取关联名称

时间:2019-05-09 15:28:17

标签: ruby-on-rails activerecord

我有以下型号:带有送货地址和账单地址的订单。在初始化每个地址时,我想自动设置一个类型字段来确定种类(船或帐单)。

class Order < ApplicationRecord
  belongs_to :ship_address, class_name: 'Address'
  belongs_to :bill_address, class_name: 'Address'
end

class Address < ApplicationRecord
  after_initialize do |address|
    #how do i know if it's a :ship_address or :bill_address?
    self.kind = "ship" 
  end
end

我想自动设置一个类型字段,以便得到以下信息:

address = Order.create_ship_address!(params)
address.kind #=> "ship"

我已经检查了Reflections,但是看起来对Class来说效果很好,但是对于实例来说却不是。

2 个答案:

答案 0 :(得分:0)

在创建地址之前简单地将kind = 'ship'合并到您的参数中

params.merge(kind: "ship")

然后打电话

address = Order.create_ship_address!(params)

现在您将得到

address.kind #=> 'ship'

答案 1 :(得分:0)

因此,我最终通过使用Rails ActiveRecord内部语法来解决此问题,这使其变得非常快捷,便捷:

class Order < ApplicationRecord
  belongs_to :ship_address, -> { where(kind: :ship) }, class_name: 'Address'
  belongs_to :bill_address, -> { where(kind: :bill) }, class_name: 'Address'
end

我决定在我的地址模型中添加一个字段kind,并且使用了Enum这样的功能:

class Address < ApplicationRecord
  enum kind: [:ship, :bill]
end

总体而言,将ActiveRecord关联与作用域一起使用可以解决我的问题。它使使用起来非常方便,因为当您实例化新地址时,kind属性已经设置好,可以有效地解决我的问题。

@bill_address = Order.last.build_bill_address
@bill_address.kind #=> 'bill'