Перекрестная передача параметров в Rails 3 - PullRequest
1 голос
/ 09 февраля 2012

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

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)

было бы хорошо. Спасибо за помощь, спасибо.

Ответы [ 2 ]

5 голосов
/ 09 февраля 2012

Из Руководства по интерфейсу запросов Active Record :

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

Вместо этого напишите методы класса:

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
2 голосов
/ 09 февраля 2012

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

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