Область действия связанный элемент с таблицей соединений

Я пытаюсь охватить основную группу моего пользователя. Эта группа отмечена с кошкой: которой 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

Другие вопросы по тегам