I have an object that I want created once and accessible in one of my models. Where do I put him? I'm afraid if I put him in the model class file he'll get created every time I make a new instance of that model. I only want this object created once at start up. Here's the object:
require 'pubnub' publish_key = 'fdasfs' subscribe_key = 'sdfsdsf' secret_key = 'fsdfsd' ssl_on = false pubnub_obj = Pubnub.new(publish_key, subscribe_key, secret_key, ssl_on)
I use him like this in the model:
class Message < ActiveRecord::Base def self.send_new_message_client(message) message = { 'some_data' => message } info = pubnub_obj.publish({ 'channel' => 'testing', 'message' => message }) puts(info) end end
How is singleton different than global variable/class? The Singleton pattern is basically just a lazily initialized global variable. It ensures that the class has one instance and that instance is globally accessible. However, do not confuse Singleton design pattern with single instances.
Singleton class ensures that not more than one object is created. However, having a global object doesn't ensure this. This class will not create more than one object.
It falls under the category of the creational design pattern in Java. A Singleton class in Java allows only one instance to be created and provides global access to all other classes through this single object or instance.
In object-oriented programming, a singleton class is a class that can have only one object (an instance of the class) at a time.
In Rails, objects are recreated on each request. If this is some kind of service, it should be a singleton in the scope of a request.
Singleton objects should be created with the ruby singleton mixin:
require 'singleton' class Pubnub include Singleton def initialize(publish_key, subscribe_key, secret_key, ssl_on) # ... end def publish # ... end end
Then you can call it with the instance
method:
Pubnub.instance.publish
This way you make sure that this object will actually be a singleton (only one instance will exist).
You can place it safely in the models
directory, though I often prefer the lib
directory or maybe create a new directory for services. It depends on the situation.
Hope it helps!
If you want only one instance in your whole application, use a singleton, otherwise use a class variable.
To use a singleton, include the Singleton mixin.
require 'singleton' class Pubnub include Singleton attr_writer :publish_key, :subscribe_key, :secret_key, :ssl_on def publish #... end end
and then use it like this:
require 'pubnub' class Message < ActiveRecord::Base Pubnub.instance.publish_key = 'xyz' Pubnub.instance.subscribe_key = 'xyz' Pubnub.instance.secret_key = 'xyz' Pubnub.instance.ssl_on = 'xyz' def self.send_new_message_client(message) message = { 'some_data' => message } info = Pubnub.instance.publish({ 'channel' => 'testing', 'message' => message }) puts(info) end end
You could also make it a class variable, to link it more tightly to a specific model:
require 'pubnub' class Message < ActiveRecord::Base @@pubnub_obj = Pubnub.new('xyz', 'xyz', 'xyz', 'xyz') def self.send_new_message_client(message) message = { 'some_data' => message } info = @@pubnub_obj.publish({ 'channel' => 'testing', 'message' => message }) puts(info) end end
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With