2

我从来没有向开源项目提交过任何东西,坦率地说,我不在乎人们对这些方法的看法。我喜欢“最后一个”和“第一个”方法,并希望将该概念扩展到“第二个”-“第九个”方法以进行抽样。

我如何创建自己的自定义方法,将这些方法移植到 ActiveRecord 上?

**目前正在 railscasts.com 观看 Ryan Bates 的截屏视频 #50

** 关于如何实现这一点的头脑风暴,我认为它可以循环遍历 :id 值(0、1、2、3、4...),直到找到下一条记录。然后“第三个”命令可以跳过第一个匹配项,直到找到第二个匹配项(Model.third),依此类推。哈现在我想知道 .first 是否使用相同的方法。我想我会检查源代码。:)

** 当我在这条路上冒险时,我会留下一个相关链接列表(我不能列出超过 2 个链接,除非我得到 10 分。给我一个,这样我就可以添加更多)

http://railscasts.com/episodes/50-contributing-to-rails

http://edgeguides.rubyonrails.org/contributing_to_ruby_on_rails.html

4

2 回答 2

1

它实际上比您想象的要复杂一些,因为first它们last不是单个类上的单个方法,而是在 ActiveRecord 中的许多不同类上实现的。

例如,

  • 您可以使用Post.first, 在这种情况下您正在调用ActiveRecord::Base#first.

  • 您可以使用Post.where(:submitted => true).first, 在这种情况下您正在调用ActiveRecord::Relation#first

  • 您可以使用Post.comments.first, 在这种情况下您正在调用ActiveRecord::Associations::CollectionAssociation#first

看看这是怎么回事?为了使 、 等具有类似的行为secondthird您需要在多个地方实现这些方法,而不仅仅是一个。

但只是为了让您开始,以下是您可以实施的方法ActiveRecord::Relation#second

class ActiveRecord::Relation
  def second
    if loaded?
      @records[1]
    else
      @second ||= limit(2).to_a[1]
    end
  end
end

例如,在初始化程序中执行这段代码,突然间你调用second了所有的关系。

于 2012-09-09T01:35:52.573 回答
0

如果您的态度是“坦率地说,不在乎 Rails 的人们对这些方法的看法”,那么我不会指望您将某些东西投入到 Rails 核心中的运气,但是说欢迎任何人从 github 中提取源代码和进行自己的修改。

同样,您可以自由地向 Rails 团队提交“拉取请求”,以使您将更改提交回 Rails,但是它们是否合并回 Rails 由 Rails 的维护者决定。

开始在 github 上克隆项目,自己进行更改,然后提交拉取请求。这里有明确的说明http://guides.rubyonrails.org/contributing_to_ruby_on_rails.html(特别是第 5 节)

于 2012-09-09T01:23:59.187 回答