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。