【问题标题】:Add a global function available to all activerecord model in Rails在 Rails 中添加可用于所有 activerecord 模型的全局函数
【发布时间】:2013-02-15 05:37:52
【问题描述】:

大家好,我想添加一个这样的函数,它可以将随机记录返回给我的结构中存在的所有活动记录模型。我该怎么做呢?

  def self.random
   if (c = count) != 0
    find(:first, :offset =>rand(c))
   end
  end

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    为什么这么麻烦?

    Model.order("RANDOM()").first
    

    在这个问题上有更好的性能查询

    Rails 3: Get Random Record

    【讨论】:

    • 好吧,自欺欺人就可以了!大声笑非常感谢,一旦它允许我,我会做出正确的答案。
    【解决方案2】:

    尽管您可以直接使用 sql,但我将把它留在这里以供将来参考,以便将类方法添加到所有 ActiveRecord 对象。

    class MyActiveRecordBase < ActiveRecord::Base
      def self.random
        if (c = count) != 0
          find(:first, :offset =>rand(c))
        end
      end
    end
    

    现在确保您希望此类方法包含的每个模型都从 MyActiveRecordBase 扩展

    class Model < MyActiveRecordBase
    end
    
    class AnotherModel < MyActiveRecordBase
    end
    

    【讨论】:

    • 这真的很有帮助!非常感谢,以后会遇到这样的问题,谢谢!有没有办法在使用 rails g 创建模型时指定超类?
    • @MadhanPadmanabhan 我不确定。如果我找到办法,我会编辑答案并给你发评论。
    【解决方案3】:

    在 /lib 文件夹中创建一个模块作为 models_methods.rb。

    在这个模块内创建一个方法,

    def rand(model)
    
       model.order("RANDOM()").first
    
    end
    
    def string_to_url(model)
    
      model.find(2).name.gsub([^A-Za-z0-9],/ /).downcase)
    
    end
    

    将此模块作为“包含 ModelsMethods”包含在您的所有模型中。该模块可以包含您想要跨模型使用的所有方法。

    【讨论】:

      猜你喜欢
      • 2017-01-19
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多