Подтвердить, что модели ActiveRecord имеют одинаковую связь / группу - PullRequest
0 голосов
/ 15 ноября 2018

Так что я пытаюсь обдумать пользовательскую проверку на двух моделях ActiveRecord.Приложение, над которым я работаю, содержит 3 модели;записка, писатель и тетрадь.Всякий раз, когда я создаю заметку через форму, я хочу подтвердить, что у нее есть та же самая записная книжка, с которой в данный момент разрешено работать автору при создании или обновлении.

Модели выглядят действительно упрощенными, как это;*

class Notebook < ApplicationRecord
   has_many :notes
   has_many :writers
end

class Writer < ApplicationRecord
   has_many :notes
   belongs_to: notebook
end

class Note < ApplicationRecord
   belongs_to: writer
   belongs_to: notebook
end

Поэтому всякий раз, когда я делаю что-то подобное;

another_notebook = Notebook.new

writer = Writer.new

note = Note.new(writer: writer, notebook: another_notebook)
note.save!

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

1 Ответ

0 голосов
/ 16 ноября 2018

Сначала просто начните с создания косвенных ассоциаций:

class Notebook < ApplicationRecord
   has_many :notes
   has_many :writers, through: :notes
end

class Note < ApplicationRecord
   belongs_to: writer
   belongs_to: notebook
end

class Writer < ApplicationRecord
   has_many :notes
   has_many :notebooks, through: :notes
   # ...
end

Это создает связь многих ко многим между Блокнотом и Writer.

Если затем вы хотите добавить правило, чтоwriter может создавать заметки только в определенной записной книжке:

class Writer < ApplicationRecord
   has_many :notes
   has_many :notebooks, through: :notes
   belongs_to :current_notebook, class: 'Notebook'
end

class Note < ApplicationRecord
  # ...
  validate :is_current_notebook

  def is_current_notebook
    unless notebook == writer.current_notebook
      errors.add(:notebook, 'is not valid.')
    end
  end
end

Тем не менее, я бы подумал, действительно ли это подходит для проверки модели, так как это похоже на проблему авторизации, которая должна решатьсяCanCanCan или Pundit, а не проблема неправильного пользовательского ввода, который должен обрабатываться валидациями.

...