Справка postgres_ext/serializers кажется такой простой, но ничего не может заставить работать, как описано

https://github.com/dockyard/postgres_ext-serializers

это кажется таким простым в настройке, но я не могу заставить работать какие-либо базовые функции с точки зрения перемещения JSON с рельсов на postgres. Я попытался включить следующее в мой ams init, в мои конкретные сериализаторы и в мои модели, но, похоже, он никогда не активируется.

Я использую Rails 4.2.3 и Ruby 2.2.

и это то, что я пытался добавить в несколько файлов:

требуется 'postgres_ext/serializers'

Очень ценю вашу помощь, я знаю, что должен упустить что-то очевидное.

Обновление: чтобы дать немного больше контекста, если вы читаете инструкции README.md для этого драгоценного камня, там просто написано "

Просто требуйте 'postgres_ext/serializers' и используйте ActiveModel::Serializers как обычно!

Поэтому я добавил require 'postgres_ext/serializers' в свой application.rb, внес небольшое редактирование в сериализатор, чтобы проверить, работает ли он:

class UserSerializer < ActiveModel::Serializer

  cached false

  attributes :id, :username, :location, :full_name

  def full_name
    "#{object.first_name} #{object.last_name}"
  end

  def full_name__sql
    "first_name || ' ' || email"
  end

end

Затем я запускал в консоли Rails следующее:

users = User.first(10)
ActiveModel::ArraySerializer.new(users, each_serializer: UserSerializer).to_json

Но атрибут полного имени __sql никогда не отображался, и, похоже, он не извлекал данные из postgres иначе, чем раньше.

А вот как выглядит мой application.rb:

# require 'postgres_ext/serializers' ### Doesn't work here

require File.expand_path('../boot', __FILE__)

require 'rails/all'

require 'postgres_ext/serializers'

Bundler.require(*Rails.groups)

module Baller
  class Application < Rails::Application
    # Do not swallow errors in after_commit/after_rollback callbacks.
    config.active_record.raise_in_transactional_callbacks = true

    # From: http://www.benfranklinlabs.com/where-to-put-rails-modules/
    # config.autoload_paths += %W(#{config.root}/lib) # add this line
    config.autoload_paths += %W(#{config.root}/lib)
    config.autoload_paths += Dir["#{config.root}/lib/**/"]
  end
end

Спасибо!


person avian    schedule 05.08.2015    source источник
comment
Пожалуйста, добавьте точные сообщения об ошибках в свой вопрос. Что именно не работает и как вы это знаете?   -  person EugZol    schedule 14.08.2015
comment
@EugZol только что добавил больше деталей к моему сообщению. Спасибо, что посмотрели!   -  person avian    schedule 15.08.2015


Ответы (1)


Вы пытались добавить этот require 'postgres_ext/serializers' в верхнюю часть вашего config/application.rb. Я предполагаю, что это должно требоваться прежде всего, когда это изменяет драйверы Postgres.

Обновите, чтобы ответить на ваше обновление:

def full_name__sql
  "first_name || ' ' || email"
end

должно быть:

def self.full_name__sql
 "first_name || ' ' || email"
end

Из документов:

... вызов путем поиска метода класса с тем же именем и суффиксом __sql ...

person smallbutton    schedule 15.08.2015
comment
Да, но я получаю сообщение об ошибке, когда включаю его в самом верху: gems/active_model_serializers-0.8.0/lib/active_model_serializers.rb:12:in `‹module:ActiveModel›': неинициализированная константа Rails::Railtie (NameError) Самое раннее в файле, которое я могу включить, чтобы оно работало, находится сразу после: require 'rails/all' Очень ценю любую помощь в этом! - person avian; 15.08.2015
comment
так что это не работает, когда вы включаете его после rails/all ? Я думаю, после этого должно быть правильное место, чем. - person smallbutton; 15.08.2015
comment
Когда я включаю его после того, как rails/all консоль загружается без ошибки, но это не работает в том смысле, что postgres_ext/serializers, кажется, не активирован или не подключен. - person avian; 15.08.2015
comment
Прочитайте мой обновленный пост. Метод должен быть методом класса. - person smallbutton; 15.08.2015
comment
метод класса не был проблемой, поскольку я пробовал оба способа... оказывается, что сериализуемая переменная должна иметь тип ActiveRecord::Relation... и поскольку users = User.first(10) возвращает массив объектов User, а не ActiveRecord::Relation, это не запускает код. Итак, я изменил свой тест, чтобы использовать User.where(id›100).limit(10), и кажется, что он пытается работать, но теперь я получаю новую ошибку неправильное количество аргументов... Я открою новый Сообщение SE, если я не могу понять это. Спасибо за помощь! - person avian; 16.08.2015