Как я могу убедиться, что метод, который я ввел в свою модель, доступен извне?

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

Допустим, у меня простая модель:

 class Subscription < ActiveRecord::Base
  attr_accessor :subscribed

  def subscribed
    @subscribed = Subscription.where(task_id, user_id)
    !@subscribed.empty?
  end

end
  

Я хотел бы убедиться, что я могу взять экземпляр @subscription и вызвать @subscription.subscribed — на данный момент он не может найти метод.

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

1. Вы имеете в виду, что он не может найти функцию, потому что у вас нет экземпляра подписки?

2. Нет, кажется, у меня есть экземпляр, но когда, если я правильно извлекаю экземпляр подписки из базы данных, я не могу вызвать для него подписанный метод — но я не знаю, почему нет. Как будто он частный, но я никогда не говорил, что так и должно быть.

3. Можете ли вы опубликовать точное сообщение об ошибке?

4. Что вам Subscription.instance_methods.grep(/subscribed/) говорит?

5. Точно, вы, вероятно, вызываете subscribed коллекцию Subscription s.

Ответ №1:

Я думаю, вы делаете что-то вроде:

 @subscription = Subscription.where(task_id, user_id)
@subscription.subscribed
  

вместо чего-то подобного:

 @subscription = Subscription.where(task_id, user_id).first
@subscription.subscribed
  

Это всего лишь предположение.

Ответ №2:

Я считаю, что проблема в вашем where звонке. Попробуйте это:

 class Subscription < ActiveRecord::Base
  belongs_to :task
  belongs_to :user

  attr_accessor :subscribed

  def subscribed?
    @subscribed ||= !Subscription.where(:task_id => task.id, :user_id => user.id).empty?
  end

end
  

Если я правильно понимаю, что вы пытаетесь сделать, я думаю, это должно сработать.

Но для меня по-прежнему не имеет большого смысла использовать этот метод в Subscription модели. Если существует подписка, не означает ли это, что пользователь подписывается автоматически. Это должен был быть метод класса mabye? Я бы подумал user.subscribed_to? issue , что or Issue.has_subscriber? user было бы лучшим местом для решения этой проблемы.

Ответ №3:

Если я понимаю вашу проблему, вы можете сделать:

 class Subscription < ActiveRecord::Base
  attr_accessor :subscribed

  def subscribed?
    @subscribed = Subscription.where(task_id, user_id)
    !@subscribed.empty?
  end

end
  

и вы можете сделать (a.i):

 s = Subscription.first
s.subscribed? # true or false
s.subscribed # the object (@subscribed)
  

Ответ №4:

Из вашей ошибки в комментариях ваш вызываемый объект @subscription указывает не на экземпляр Subscription , а на отношение.

Вероятно, вы сделали что-то вроде

 @subscription = Subscription.where(... some condition ...)
  

который возвращает отношение, к которому вы можете получить доступ в виде массива. Итак, вызовите .first , чтобы извлечь из него первый элемент. Или использовать Subscription.find .

Надеюсь, это поможет.