Rails: Как создать has_many через отношения через идентификаторы в модели? - PullRequest
0 голосов
/ 13 мая 2019

У меня есть три модели: Customer, Branch и CustomerBranch

В модели клиента:

has_many :customer_branches, inverse_of: :customer
has_many :branches, through: :customer_branches

В модели филиала:

has_many :customer_branches, inverse_of: :branch, dependent: :restrict_with_exception
has_many :customers, through: :customer_branches

В модели CustomerBranch:

belongs_to :customer, inverse_of: :customer_branches
belongs_to :branch, inverse_of: :customer_branches

Это приложение только для API, и я получу массив идентификаторов филиалов.Теперь я хочу назначить / удалить ответвления от клиента на основе полученных идентификаторов.

У меня есть решение, чтобы справиться с этим, но я не думаю, что это лучший из возможных способов.Вот мое текущее решение:

attr_accessor :branches_ids
after_save :assign_branches

def assign_branches
  return if self.branches_ids.nil?
  old_branch_ids = self.branch_ids

  remove_branch_ids = old_branch_ids - self.branches_ids

  self.customer_branches.where(id: remove_branch_ids).delete_all if remove_branch_ids.present?

  self.branches << Branch.where(id: self.branches_ids)
end

Есть ли лучший способ справиться с этим?Заранее спасибо !!

Ответы [ 2 ]

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

вы можете сделать это в вашем контроллере:

def assign_branches
  customer = Customer.find(params[:id]) // however you gonna get custome whom we gonna assign branches
  customer.branches = Branch.where(id: params[:branch_ids]) //however way you want to get ids
end

Метод collection = заставляет коллекцию содержать только предоставленные объекты, добавляя и удаляя по мере необходимости.Изменения сохраняются в базе данных. Подробнее об ассоциации вы можете узнать через: https://guides.rubyonrails.org/association_basics.html#belongs-to-association-reference

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

Хорошо, чтобы ответить на вопрос. Вы можете просто установить идентификаторы непосредственно на клиента:

customer = Customer.find(1)
customer.branches_ids = [1,2,3]

Rails будет обрабатывать все добавления и удаления.

Также работает с новыми клиентами:

customer = Customer.new
customer.name = "blabla"
customer.branches_ids = [1,2,3]
customer.save
...