Rails: обновление пользовательского атрибута таблицы соединений при создании новой записи - PullRequest
0 голосов
/ 07 марта 2020

Допустим, у меня есть две модели: Performance и Band, и для их соединения у меня есть таблица соединений под названием performers. Мои модели ActiveRecord настроены следующим образом:

class Band < ApplicationRecord
  has_many :performers
  has_many :performances, through: :performers, dependent: :destroy
end

class Performance < ApplicationRecord
  has_many :performers
  has_many :bands, through: :performers, dependent: :destroy
end

class Performer < ApplicationRecord
  belongs_to :band
  belongs_to :performance
end

Теперь сложная часть. У меня есть пользовательский атрибут с именем permissions в таблице performers, который фиксирует уровни разрешений (владелец, редактор, средство просмотра) для исполнителя, который определяет, кто может вносить изменения в исполнение. Это подводит меня к моему вопросу: когда группа создает новое исполнение, как я могу установить значение для таблицы соединения во время создания, например:

    def create
      performance = Performance.new(performance_params)
      # here I add a performance to a band's performances, which creates a new performer record
      band.performances << performance
      # what I would also like to do (at the same time if possible) is also define the permission level 
      # during creation something like but:
      performer = band.performers.last
      performer.permissions = 'owner'
      performer.save
      render json: serialize(performance), status: 200 
    end

Есть ли в Rails что-то, что может позволить мне изменить таблицы соединения атрибут при создании ассоциации?

РЕДАКТИРОВАТЬ

Для справки, прямо сейчас я делаю:

def create
     performance = Performance.new(performance_params)
     performer = Performer.new
     performer.band = Band.find(params[:band_id])
     performer.permissions = 'owner'
     performance.performers << performer
     performance.save!
     render json: serialize(performance), status: 200
end

Но было интересно, было ли что-то попроще.

1 Ответ

0 голосов
/ 07 марта 2020

Вы можете использовать либо Обратные вызовы ассоциации на has_many, либо добавить соответствующую функцию обратного вызова к Performer, поскольку она все еще создается как модель, даже если она присоединяется к ней.

Что-то вроде:

class Performer < ApplicationRecord
  belongs_to :band
  belongs_to :performance

  before_create :set_permissions

  private

  def set_permissions
    self.permissions = 'owner'
  end
end
...