Область действия связанный элемент с таблицей соединений
Я пытаюсь охватить основную группу моего пользователя. Эта группа отмечена с кошкой: которой 2.
Поэтому я подумал сделать это с такой областью, как
class User < ApplicationRecord
has_many :users_group, dependent: :destroy
has_many :groups, through: :users_group
scope :my_group, -> { self.joins(:groups).where('groups.cat = 2').limit(1) }
end
Но команда ниже не работает:
current_user.my_group
Можете ли вы привести меня к правильному пути достижения этого?
2 ответа
Как говорит Марио, область действия работает с коллекцией, а не с экземпляром.
Если вы хотите сохранить метод в User
Модель вы можете использовать следующие:
user.rb
def my_group
groups.find_by_cat(2)
end
С помощью find_by
вернет одну группу, а не используя where
/ limit
, Если группа не найдена, она вернется nil
,
Я бы посоветовал использовать область для возврата одного экземпляра, это немного против паттерна, и это было бы лучше сделать, используя этот метод, или сбросив следующий метод в Group
и звонит current_user.groups.my_group
- хотя название my_group
звучит немного неуместно, как это. Для полноты здесь это независимо:
group.rb
def my_group
find_by_cat(2)
end
current_user
не возвращает отношение ActiveRecord, оно просто возвращает пользователя, поэтому вы не можете связать его вместе с областью действия (я предполагаю, что сообщение об ошибке, которое вы получаете, undefined method 'my_group' for #<User>
?). Добавьте область действия в свой класс Group и используйте ее через groups
отношение has_many, напримерcurrent_user.groups.my_group