Прежде всего, будьте осторожны. Поскольку вы используете has_and_belongs_to_many
для обоих отношений, то может быть более одного Group
для данных User
и Assignment
. Поэтому я собираюсь реализовать метод, который возвращает массив Group
s.
Во-вторых, имя метода User#get_group
, принимающего идентификатор присваивания, довольно обманчиво и не похоже на Ruby.
Вот простой способ получить все общие группы, используя Array#&
Руби, оператор пересечения. Я дал этому методу гораздо более откровенное имя и поместил его в Group
, поскольку он возвращает Group
экземпляров. Обратите внимание, однако, что он загружает Group
с, которые связаны с одним, но не с другим:
class Group < ActiveRecord::Base
has_and_belongs_to_many :assignments
has_and_belongs_to_many :users
# Use the array intersection operator to find all groups associated with both the User and Assignment
# instances that were passed in
def self.find_all_by_user_and_assignment(user, assignment)
user.groups & assignment.groups
end
end
Тогда, если вам действительно нужен метод User#get_groups
, вы можете определить его следующим образом:
class User < ActiveRecord::Base
has_and_belongs_to_many :groups
def get_groups(assignment_id)
Group.find_all_by_user_and_assignment(self, Assignment.find(assignment_id))
end
end
Хотя я бы, наверное, вместо этого назвал User#groups_by_assignment_id
.
Моя Assignment
модель просто:
class Assignment < ActiveRecord::Base
has_and_belongs_to_many :groups
end