1

Я пытаюсь запросить db, который использует соединение, чтобы найти пользователей, которым требуется предупреждение. Мой запрос отлично работает в модели, для которой он написан, и он также работает через область, когда передаваемый параметр является явным. Однако, когда я передаю параметр как переменную, он не работает. Вот мой код:Параметр сквозной области, проходящий в Rails 3

class Alert < ActiveRecord::Base 
    belongs_to :user 
    attr_accessible :first_alert, :second_alert, :third_alert, :user_id 
    def self.find_users_to_alert(time) 
    where(:third_alert => time) 
    end 
    scope :alerter, find_users_to_alert (here is where i want to pass param) 
end 

class User < ActiveRecord::Base 
    has_many :alerts 
    attr_accessor :password 
    attr_accessible :name, :email, :password, :password_confirmation 

    scope :alerts_to_be_sent, joins(:alerts) & Alert.alerter 
end 

Ошибка, которую я получаю, - это неопределенная локальная переменная или метод NameError. Но я бы подумал передать значение переменной в консоли rails как:

User.alerts_to_be_sent(5) 

было бы в порядке. Помощь будет оценена с благодарностью.

ответ

5

От Active Record Query Interface Guide:

Использование метода класса является предпочтительным способом принимать аргументы в пользу областей. Эти методы будут доступны и на объектах ассоциации [...]

Так писать методы класса вместо:

class Alert < ActiveRecord::Base 
    def self.alerter(t) 
    find_users_to_alert(t) 
    end 
end 

def User < ActiveRecord::Base 
    def self.alerts_to_be_sent(t) 
    joins(:alerts) & Alert.alerter(t) 
    end 
end 
+0

спасибо, что вы меня очень разочаровали. Мне вообще не нужно было использовать область видимости. Комбинированные методы класса хорошо работали. – Hugs

2

Я думаю, что вы ищете лямбда области видимости синтаксиса

scope :alerter, lambda { |number| find_users_to_alert(number) } 
scope :alerts_to_be_sent, lambda { |number| joins(:alerts) & Alert.alerter(number) } 
+0

Это тоже будет работать, но методы класса являются «предпочтительным», но настройки меняются. –

+0

Да, лично я сделал бы scope_to_be_sent scope в методе класса из-за его сложности, но иногда краткость областей мне понравилась. Опять же, это вопрос предпочтения. –

+0

Обратите внимание, почему они предпочтительнее - область может быть закодирована и т. Д. - например, 'current_user.products.available' Я не думаю, что вы можете реализовать' available'as метод класса здесь. – DavidC

Смежные вопросы