Глобальный идентификатор модели можно найти с помощью #to_global_id
:
gid = MyModel.first.to_global_id
gid.uri # => #<URI ...
gid.to_s # => "gid://..."
GlobalID::Locator.locate(gid) # => #<MyModel
Код для GlobalID
здесь .
СоздаетURI из имени приложения, класса модели, идентификатора модели и необязательных параметров.Это делается в GlobalID :: URI :: GID .
Вы можете создать свой собственный GID следующим образом:
URI::GID.create('myapp', MyModel.first, database: 'my_app_development')
# => #<URI::GID gid://myapp/MyModel/1?database=my_app_development>
Переданная модель должна быть жалобой ActiveRecord,поэтому передача PORO (Plain Old Ruby Object) не будет работать:
class MyModel
end
URI::GID.create('myapp', MyModel.new)
# => NoMethodError (undefined method `id'
Давайте добавим атрибут id:
MyModel = Struct.new(:id)
gid = URI::GID.create('myapp', MyModel.new(1))
# => #<URI::GID gid://myapp/MyModel/1>
GlobalID::Locator.locate(gid)
# => NoMethodError (undefined method `find' for MyModel:Class)
И метод класса #find
:
MyModel = Struct.new(:id) do
def self.find(id)
new(id)
end
end
gid = URI::GID.create('myapp', MyModel.new(1))
GlobalID::Locator.locate(gid)
# => #<struct MyModel id="1">