2017-12-02 2 views
0

Ich versuche Push-Benachrichtigungen in meinem Ruby-Projekt zu implementieren. Ich habe diesen Code gefunden, kann aber nicht sagen, was er tut. In meinem Projekt verwende ich ActiveRecord nicht, da ich MongoDB verwende. Die beiden Linien kann ich nicht verstehen, sind wie folgtWorin besteht der ActiveRecord Code Scope Code?

scope :android, -> { where(device_type: 'android') } 

Ich bin nicht familair mit Active so ist die "-> {where (device_type: 'Android')}" eine SQL-Suche? Was ist das Ergebnis dieses Codes? Fragen Sie sich, wie ich das umsetzen würde, seit ich MongoDB verwende?

Die "Device.android.map" wo und wie kommt die .android? Ich vermute, es gibt eine Unterklasse von Gerätename Android?

Code:

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 

UPDATE:

Ok, das Android ist eine häufig verwendete Abfrage, die als Methodenaufrufe verwendet werden kann. Nun weiß ich, was Umfang, aber nicht sicher, wie mit MongoDB und MongoID implementieren.

Ich denke, das ist richtig für Schienen 4 und MongoID?

scope :android, where(:device_type => 'android') 

Also wenn das obige korrekt ist, dann hinterlässt es eine Frage, was das bedeutet?

&:registration_id 

Antwort

1

Bitte lesen Sie über Active Record active record zu verstehen, was es tut. Auch einen Blick auf ORM hat und scope, android ist keine Unterklasse es im Grunde

eine Klassenmethode zum Abrufen und Abfragen von Objekten hinzufügen.

so haben Sie grundsätzlich Klassenmethode Android auf Geräteklasse genannt

Wenn Sie Gerät aufrufen.Android verwandelt sich in Abfrage SELECT "Geräte". * FROM "Geräte" WHERE "Geräte". "Device_type" = "Android" und gibt alle Datensätze zurück, die WHERE-Klausel entsprechen.

Bevor Sie sich mit Device.android.map(&:registration_id) befassen, werfen Sie bitte einen Blick auf map.

Map gibt für jedes Element in enum ein neues Array mit den Ergebnissen von running block zurück.

Also im Grunde rufen Sie registration_id auf jedem Objekt, das device_type = 'android' Filter übereinstimmt. und gibt ein Array von Registrierungs-IDs zurück oder mit anderen Worten, wir schleifen über alle Objekte und sammeln Registrierungs-ID jedes Objekts und geben alle gesammelten Registrierungs-IDs zurück.

1

Lesen Sie mehr über Umfang https://apidock.com/rails/ActiveRecord/NamedScope/ClassMethods/scope

Ein Bereich stellt eine Verengung einer Datenbankabfrage

In Ihrem Fall

registration_ids= Device.android.map(&:registration_id) 

Es wird registration_id von Gerät, dessen Karte device_type ist 'Android'

In &: Registrierungs-ID & Das Symbol wird verwendet, um anzuzeigen, dass das folgende Argument als der der Methode zugewiesene Block behandelt werden soll. diese ist kein proc Methode, so dass es es ist to_proc Methode

Device.android.map genannt (&: registration_id.to_proc)

die als

Device.android.map ist die gleiche {| x | x.registration_id}

Verwandte Themen