Несколько отношений has_one к одной модели - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть модели User и Shop (Rails 5.2), которые должны иметь несколько местоположений, таких как ship_location, bill_location ... Как я могу использовать один и тот же Location несколько раз для этого?

Модель User и Shop может выглядеть примерно так

class User
  has_one :ship_location
  has_one :bill_location
end

class Shop
  has_one :ship_location
  has_one :bill_location
  has_one :contact_location
end

Но я не могу понять, как должна выглядеть модель Location. Он должен быть как можно более абстрактным, чтобы мне не приходилось определять новые отношения и / или модели, когда Location используется для другой модели.

Полагаю, мне нужно использовать какой-то полиморфизм:

class Location
  # location has owner_id and owner_type
  belongs_to :owner, polymorphic: true
end

Но это не работает, потому что user.ship_location является неоднозначным (он будет искать owner_type == "User" и owner_id == 1, но, поскольку есть также bill_location с теми же owner_type и owner_id, он не не работает).

Нужно ли создавать для этого отдельные модели с одной и той же таблицей?

1 Ответ

1 голос
/ 17 апреля 2019

1 => Возьмите столбец (скажем, location_type или любой столбец, который может иметь значение между shipping location, billing location и contact location) в Location модели

class User
  has_one :ship_location, -> { where("location_type = ?", 'ship') }, :class_name => "Location", :dependent => :destroy
  has_one :bill_location, -> { where("location_type = ?", 'bill') }, :class_name => "Location", :dependent => :destroy
end

class Shop
  has_one :ship_location, -> { where("location_type = ?", 'ship') }, :class_name => "Location", :dependent => :destroy
  has_one :bill_location, -> { where("location_type = ?", 'bill') }, :class_name => "Location", :dependent => :destroy
  has_one :contact_location, -> { where("location_type = ?", 'contact') }, :class_name => "Location", :dependent => :destroy
end

class Location
  belongs_to :user
  belongs_to :shop
  # (has column 'location_type')
end

2 => При создании Location укажите его соответствующее значение (например, ship, bill, contact), например -> Скажем, создайте location для магазина для loation_type = bill

Location.create(location_type: 'ship', foo: 'bar' ...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...