Модели -> has_many -> Дважды

#ruby-on-rails #model #associations #has-many #has-many-through

#ruby-on-rails #Модель #ассоциации #имеет-много #имеет много сквозных

Вопрос:

Итак, у меня здесь несколько запутанная взаимосвязь между заметкой, группой и пользователем. И в итоге я дважды использовал has_many в своей модели. Но в настоящее время я сосредоточен на отношениях Note и Group.

Справочная информация: У группы может быть примечание. У пользователя также может быть примечание. Вот почему моя заметка полиморфна. Однако я также создал модель объединения, называемую тегом, чтобы заметка могла принадлежать нескольким группам. Однако в моем коде я получил несколько ‘has_many: notes’. Смотрите весь мой код ниже. Каков был бы правильный способ сделать что-то подобное?

Заранее спасибо!

примечание.rb

 belongs_to :notable, :polymorphic => true
has_many :tags
has_many :groups, :through => :tags
  

user.rb

 has_many :notes, :as => :notable
  

group.rb

 has_many :notes, :as => :notable
has_many :tags
has_many :notes, :through => :tags
  

тег.rb

 belongs_to :note
belongs_to :group
  

Ответ №1:

Вам просто нужно дать ему другое имя.

 class Group
  has_many :notes, :as => :notable
  has_many :tags
  has_many :tagged_notes, :class_name => 'Note', :through => :tags
end
  

Если вам нужно только одно примечание для :as => :notable части (это было не очень понятно в вашем вопросе), вы могли бы просто сделать это:

 class Group
  has_one :note, :as => :notable
  has_many :tags
  has_many :notes, :through => :tags
end
  

Имена просто должны быть разными. Хотя с note vs notes может быть не очень понятно, в чем разница в других частях вашего кода.

Комментарии:

1. Ну, в группе всегда будет много заметок, а не только одна. Что я хочу сделать, так это это. Кто-то может написать заметку, а затем установить некоторые флажки, для каких групп они хотят применить заметку. Таким образом, в группе может быть много заметок, и одна заметка может принадлежать многим разным группам. Имеет ли это больше смысла?

2. Спасибо за ваш ответ, я проверю, как назвать это tagged_note, я думаю, не слишком знаком с этим.