Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 通过Rails 3的交叉作用域参数_Ruby On Rails_Ruby On Rails 3_Activerecord_Scope_Rails Activerecord - Fatal编程技术网

Ruby on rails 通过Rails 3的交叉作用域参数

Ruby on rails 通过Rails 3的交叉作用域参数,ruby-on-rails,ruby-on-rails-3,activerecord,scope,rails-activerecord,Ruby On Rails,Ruby On Rails 3,Activerecord,Scope,Rails Activerecord,我试图查询一个数据库,该数据库使用连接来查找需要警报的用户。我的查询在为其编写的模型中运行良好,并且当传递的参数是显式的时,它也可以在整个范围内运行。但是,当我将参数作为变量传递时,它不起作用。这是我的密码: class Alert < ActiveRecord::Base belongs_to :user attr_accessible :first_alert, :second_alert, :third_alert, :user_id def self.find_user

我试图查询一个数据库,该数据库使用连接来查找需要警报的用户。我的查询在为其编写的模型中运行良好,并且当传递的参数是显式的时,它也可以在整个范围内运行。但是,当我将参数作为变量传递时,它不起作用。这是我的密码:

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
好的。非常感谢您的帮助。

来自:

使用类方法是接受作用域参数的首选方法。这些方法仍然可以在关联对象上访问[…]

因此,请编写类方法:

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
类警报
来自:

使用类方法是接受作用域参数的首选方法。这些方法仍然可以在关联对象上访问[…]

因此,请编写类方法:

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
类警报
我想您正在寻找lambda作用域语法

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

我想您正在寻找lambda范围语法

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

谢谢你帮我省去了很多挫折。我根本不需要使用scope。组合的类方法工作得很好。谢谢你帮我省去了很多挫折。我根本不需要使用scope。组合的类方法工作得很好。这也很好,但类方法是“首选”方式,但首选项不同。是的,我个人会将警报发送到类方法中,因为它很复杂,但有时作用域的简洁性对我来说更好。再次强调,这是一个偏好的问题。请注意为什么它们是首选的-范围可以链接等-例如
当前用户.products.available
我认为您不能在这里实现
available
作为类方法。
类产品;def自动可用;self.where(可用:true);终止end
是完全可链接的,这也会起作用,但类方法是“首选”方式,但首选项不同。是的,就个人而言,我本来会将提醒发送到类方法的范围中,因为它很复杂,但有时范围的简洁对我来说更合适。再次强调,这是一个偏好的问题。请注意为什么它们是首选的-范围可以链接等-例如
当前用户.products.available
我认为您不能在这里实现
available
作为类方法。
类产品;def自动可用;self.where(可用:true);终止结束
是完全可链接的