Реализация плагина: как вызвать метод ActiveRecord? - PullRequest
2 голосов
/ 14 марта 2011

Я использую Ruby on Rails 3 и пытаюсь создать плагин для использования в промежуточном программном обеспечении Rack .Это первый раз, когда я делаю это, поэтому будьте терпеливы, если я напишу что-то неправильно.

Мне нужно вызвать метод на ActiveRecord после запуска findметод.То есть я хотел бы сделать что-то вроде этого:

@accounts = Account.find([1,2,3]).to_page

Метод to_page должен изменить некоторую информацию в данных @accounts без изменения самой структуры объекта (например, если «оригинал»)@accounts - это массив, он должен оставаться массивом.)

На данный момент в папке моего плагина у меня есть следующие файлы:

# init.rb
require 'sl_pagination'
ActiveRecord::Base.send(:include, SlPagination)


#sl_pagination.rb
module SlPagination
  extend ActiveSupport::Concern

  module ClassMethods
    def to_page
      # see below for more info
    end
  end

  module InstanceMethods
    #none
  end
end

В промежуточном программном обеспечении Rack у меня есть:

require 'sl_pagination'
...

Если в промежуточном программном обеспечении я использую Account.find([1,2,3]).to_page объявление

#sl_pagination.rb
def to_page
  return "Test_account_page"
end

, оно будет работать, и я также получу значение Test_account_page, но я не могунайдите решение изменить и вернуть сам ActiveRecord, как написано выше.Итак, как я могу изменить ActiveRecord?

Я пытался "играть" на self и return self в методе to_page, но швы не работают.Я также подумал использовать acts_as_something, но я все еще должен изучить и понять это (если вы объясните, когда используете acts_as, это излишек! :-)).Кроме того, я не знаю, может ли последнее решение помочь мне выполнить то, к чему я стремлюсь.

1 Ответ

0 голосов
/ 15 марта 2011

Вам нужно подключиться к ActiveRecord::Relation, чтобы расширить AR и вести себя как другие функции AR.Вы можете найти более подробную информацию о ActiveRecord::Relation в http://railscasts.com/episodes/239-activerecord-relation-walkthrough.

...