Как получить имя ассоциации из экземпляра ActiveRecord - PullRequest
0 голосов
/ 09 мая 2019

У меня есть следующие модели: заказ с адресом доставки и адресом для выставления счета. При инициализации каждого адреса я хотел бы автоматически установить поле типа, чтобы определить тип (судно или счет).

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, но похоже, что это хорошо работает для класса, но не для экземпляра.

Ответы [ 2 ]

0 голосов
/ 19 мая 2019

Итак, в конце концов я исправил это, используя внутренний синтаксис 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'
0 голосов
/ 10 мая 2019

Просто объедините kind = 'ship' в своих параметрах перед созданием адреса

params.merge(kind: "ship")

затем позвоните,

address = Order.create_ship_address!(params)

Теперь вы получите,

address.kind #=> 'ship'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...