У меня есть таблица пользователей в моей базе данных. Пользователь может быть либо типа «администратор» или «менеджер».
Учитывая приведенные ниже модели и схемы, мне бы хотелось, чтобы для каждого экземпляра пользователя 'manager' пользователь 'admin' мог выбрать одно, несколько или все местоположения арендатора, к которому принадлежит менеджер, чтобы выбрать, какой местоположения, которые менеджер может контролировать.
Мои модели
class User < ActiveRecord::Base
belongs_to :tenant
class Tenant < ActiveRecord::Base
has_many :users, dependent: :destroy
has_many :locations, dependent: :destroy
class Location < ActiveRecord::Base
belongs_to :tenant, inverse_of: :locations
Я пробовал два пути
Сначала , пытающийся установить ассоциативную ассоциацию has_many между моделями User и Location. Однако я не могу обернуться, структурируя эту область видимости так, чтобы пользователь с правами администратора мог выбирать, какие местоположения могут контролировать пользователи с правами администратора.
Второй , настройка атрибута Control_Locations в таблице пользователей. Затем я настроил некоторый код, чтобы пользователь «admin» мог выбирать, какие местоположения может контролировать «manager», заполняя его атрибут «control_locations». Однако то, что сохраняется в базе данных (внутри массива Control_Locations), это строки, а не экземпляры местоположений.
Вот код, который я пробовал для второго пути:
Миграция
def change
add_column :users, :controlled_locations, :string, array: true, default: []
end
На виду
= f.input :controlled_locations, label: 'Select', collection: @tenant_locations, include_blank: "Anything", wrapper_html: { class: 'form-group' }, as: :check_boxes, include_hidden: false, input_html: {multiple: true}
В пользовательском контроллере (внутри метода обновления)
if params["user"]["controlled_locations"]
params["user"]["controlled_locations"].each do |l|
resource.controlled_locations << Location.find(l.to_i)
end
resource.save!
end
Что я ожидаю
Прежде всего, я не совсем уверен, что второй путь, который я пробовал, - это хороший подход (хранение массивов в БД). Так что мой лучший выбор - это создать ассоциацию с определенными границами, если это возможно.
В случае, если возможен второй путь, я хотел бы получить что-то вроде этого. Допустим, войдя в Admin, я выбрал, что пользователь с ID 1 (менеджер) может управлять одним местоположением (Бостонский стадион):
user = User.find(1)
user.controlled_locations = [#<Location id: 55, name: "Boston Stadium", created_at: "2018-10-03 12:45:58", updated_at: "2018-10-03 12:45:58", tenant_id: 5>]
Вместо этого я получаю следующее:
user = User.find(1)
user.controlled_locations = ["#<Location:0x007fd2be0717a8>"]
Вместо экземпляров местоположений в массиве сохраняются простые строки.