Ruby on rails 我想创建';第二'';第三';(可能最多到第九个)ActiveRecord的自定义方法,并可能推送(贡献)对rails的更改

Ruby on rails 我想创建';第二'';第三';(可能最多到第九个)ActiveRecord的自定义方法,并可能推送(贡献)对rails的更改,ruby-on-rails,ruby,activerecord,open-source,customization,Ruby On Rails,Ruby,Activerecord,Open Source,Customization,我从来没有向开源项目提交过任何东西,坦率地说,我不在乎rails人员对这些方法的看法。我喜欢“最后一种”和“第一种”方法,为了便于抽样,我想将这一概念扩展到“第二种”-“第九种”方法 如何创建自己的自定义方法,将这些方法移植到ActiveRecord **目前正在railscasts.com上观看Ryan Bates的50集电影 **在讨论如何实现这一点时,我认为它可以在:id值(0、1、2、3、4…)上循环,直到找到下一条记录。然后,“第三个”命令可以跳过第一个匹配,直到找到第二个匹配(Mod

我从来没有向开源项目提交过任何东西,坦率地说,我不在乎rails人员对这些方法的看法。我喜欢“最后一种”和“第一种”方法,为了便于抽样,我想将这一概念扩展到“第二种”-“第九种”方法

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

**目前正在railscasts.com上观看Ryan Bates的50集电影

**在讨论如何实现这一点时,我认为它可以在:id值(0、1、2、3、4…)上循环,直到找到下一条记录。然后,“第三个”命令可以跳过第一个匹配,直到找到第二个匹配(Model.third),依此类推。哈,现在我想知道。第一次使用同样的方法。我想我会查看源代码。:)

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


如果你的态度是“坦率地说,不在乎rails人对这些方法的看法”,那么我不会指望你能在rails核心中得到一些东西,不过我要说的是,欢迎任何人从github获取源代码并进行自己的修改

同样地,您可以自由地将“拉请求”提交回rails团队,以便将更改提交回rails,但是这些更改是否合并回rails则由rails的维护人员决定


要开始在github上克隆项目,请自己进行更改,然后提交请求。这里有明确的说明(具体请参见第5节)

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

比如说,

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

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

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

看看这是怎么回事?为了使
第二个
第三个
等具有类似的行为,您需要在多个位置实现这些方法,而不是仅在一个位置

但为了让您开始,下面是如何实现
ActiveRecord::Relation#second

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

例如,在初始值设定项中执行这段代码,然后突然调用所有关系的
second

很明显,我很关心他们的想法,但是不要让它阻止我,这就是我要说的一切好的-记住你也可以通过自己的修改在github上保留你自己的分支,并将你的Gemfile指向你自己的分支。我应该看哪个rails版本?master?“rails 4”的更改是在master中进行的吗?你不想为了这个而分叉并维护你自己的副本,你可以把它做成一个gem并放在Railtie中。我会给这个文件贴什么标签?active_record.rb?我同意这种猴子修补方法是理想的。我对核心类做了大量的修改,我的方式非常类似。如果你真的想分享你的工作,为什么不把它作为一个gem发布呢?如果有足够多的人喜欢它,你可能会有更好的理由花时间提出rails内核请求。