插件实现:如何在ActiveRecord上调用方法?

时间:2011-03-14 19:15:55

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord plugins

我正在使用Ruby on Rails 3,我正在尝试创建一个插件以在Rack 中间件中使用。这是我第一次体验这种体验,所以如果我写错了就要耐心等待。

我需要的是在运行find方法后在 ActiveRecord上调用方法。也就是说,我想做这样的事情:

@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 selfto_page“玩”,但它的接缝不起作用。我也想过要使用acts_as_something,但我仍然必须研究和理解(如果你在使用acts_as时解释,那就是盈余!:-))。此外,我不知道后一种解决方案能否帮助我完成我的目标。

1 个答案:

答案 0 :(得分:0)

您需要挂钩ActiveRecord::Relation以扩展AR并像其他AR功能一样运行。您可以在http://railscasts.com/episodes/239-activerecord-relation-walkthrough中找到有关ActiveRecord::Relation的更多详细信息。