Сначала просто начните с создания косвенных ассоциаций:
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, а не проблема неправильного пользовательского ввода, который должен обрабатываться валидациями.