#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
.
Надеюсь, это поможет.