ActiveRecord code scope code 的结果是什么?
What does ActiveRecord code scope code result in?
我正在尝试在我的 Ruby 项目中实施推送通知。我找到了这段代码,但不知道它做了什么。在我的项目中,我没有像使用 MongoDB 那样使用 ActiveRecord。看不懂的两行如下
scope :android, -> { where(device_type: 'android') }
我不熟悉 ActiveRecord,所以“-> { where(device_type: 'android') }”是 SQL 搜索吗?这段代码的结果是什么?想知道我将如何实施,因为我正在使用 MongoDB?
registration_ids= Device.android.map(&:registration_id)
"Device.android.map" .android 从哪里来,怎么来的?我猜有一个 Device name 的子类 android?
代码:
rails g model Device registration_id:string device_type:string
class User < ActiveRecord::Base
scope :android, -> { where(device_type: 'android') }
...
def self.notify_android(data, collapse_key = nil)
require 'gcm'
gcm = GCM.new(ENV['API_KEY']) # an api key from prerequisites
registration_ids= Device.android.map(&:registration_id) # an array of one or more client registration IDs
options = {
data: data,
collapse_key: collapse_key || 'my_app'
}
response = gcm.send(registration_ids, options)
end
...
end
更新:
好的,这个Android是一个常用查询,可以作为方法调用。所以现在我知道作用域是做什么的,但不确定如何使用 MongoDB 和 MongoID.
来实现
我认为这对 rails 4 和 MongoID 是正确的吗?
scope :android, where(:device_type => 'android')
所以,如果以上是正确的,那么还有一个问题,这是什么意思?
&:registration_id
了解作用域 https://apidock.com/rails/ActiveRecord/NamedScope/ClassMethods/scope
范围代表数据库查询的缩小
你的情况
registration_ids= Device.android.map(&:registration_id)
它将映射 registration_id 的 device_type 为 'android'
的设备
在&:registration_id中&符号用于表示后面的参数应该被视为给方法的块。这些不是 proc 方法,所以它称为 to_proc 方法
Device.android.map(&:registration_id.to_proc)
与
相同
Device.android.map { |x| x.registration_id}
请阅读活动记录 active record to understand what it does. Also have a look at ORM and scope,android 不是任何子class 它基本上是
add a class method for retrieving and querying objects.
所以您基本上在设备 class
上有 class 方法调用 android
When you call Device.android it turns into query SELECT "devices".* FROM "devices" WHERE "devices"."device_type" = 'android' and returns all the records matching where clause.
在了解Device.android.map(&:registration_id)
之前请先看看map。
Map returns a new array with the results of running block once for every element in enum.
所以基本上你是在每个匹配过滤器 device_type = 'android'
的对象上调用 registration_id
。和 returns 注册 ID 数组,换句话说,我们遍历所有对象并收集每个对象的 registration_id 并返回所有收集到的注册 ID。
我正在尝试在我的 Ruby 项目中实施推送通知。我找到了这段代码,但不知道它做了什么。在我的项目中,我没有像使用 MongoDB 那样使用 ActiveRecord。看不懂的两行如下
scope :android, -> { where(device_type: 'android') }
我不熟悉 ActiveRecord,所以“-> { where(device_type: 'android') }”是 SQL 搜索吗?这段代码的结果是什么?想知道我将如何实施,因为我正在使用 MongoDB?
registration_ids= Device.android.map(&:registration_id)
"Device.android.map" .android 从哪里来,怎么来的?我猜有一个 Device name 的子类 android?
代码:
rails g model Device registration_id:string device_type:string
class User < ActiveRecord::Base
scope :android, -> { where(device_type: 'android') }
...
def self.notify_android(data, collapse_key = nil)
require 'gcm'
gcm = GCM.new(ENV['API_KEY']) # an api key from prerequisites
registration_ids= Device.android.map(&:registration_id) # an array of one or more client registration IDs
options = {
data: data,
collapse_key: collapse_key || 'my_app'
}
response = gcm.send(registration_ids, options)
end
...
end
更新:
好的,这个Android是一个常用查询,可以作为方法调用。所以现在我知道作用域是做什么的,但不确定如何使用 MongoDB 和 MongoID.
来实现我认为这对 rails 4 和 MongoID 是正确的吗?
scope :android, where(:device_type => 'android')
所以,如果以上是正确的,那么还有一个问题,这是什么意思?
&:registration_id
了解作用域 https://apidock.com/rails/ActiveRecord/NamedScope/ClassMethods/scope
范围代表数据库查询的缩小
你的情况
registration_ids= Device.android.map(&:registration_id)
它将映射 registration_id 的 device_type 为 'android'
的设备在&:registration_id中&符号用于表示后面的参数应该被视为给方法的块。这些不是 proc 方法,所以它称为 to_proc 方法
Device.android.map(&:registration_id.to_proc)
与
相同Device.android.map { |x| x.registration_id}
请阅读活动记录 active record to understand what it does. Also have a look at ORM and scope,android 不是任何子class 它基本上是
add a class method for retrieving and querying objects.
所以您基本上在设备 class
上有 class 方法调用 androidWhen you call Device.android it turns into query SELECT "devices".* FROM "devices" WHERE "devices"."device_type" = 'android' and returns all the records matching where clause.
在了解Device.android.map(&:registration_id)
之前请先看看map。
Map returns a new array with the results of running block once for every element in enum.
所以基本上你是在每个匹配过滤器 device_type = 'android'
的对象上调用 registration_id
。和 returns 注册 ID 数组,换句话说,我们遍历所有对象并收集每个对象的 registration_id 并返回所有收集到的注册 ID。