【问题标题】:Rails 3 - creating own model and working with an othersRails 3 - 创建自己的模型并与他人合作
【发布时间】:2012-02-22 15:05:43
【问题描述】:

我有两个表用于检查视图(页面访问量)-图库和摄影师(PhotographerView)中的图片视图(PhotoView)。 因为这两个模型(和表)是相同的,所以我想为它们创建一个模型 - 类似于:

class Func < ActiveRecord::Base

  def self.check_views(model_view, data)
    last_view = model_viewView.where('ip_address = ? AND request_url = ?', request.remote_ip, request.url).order('created_at DESC').first

    unless last_view
      model_view+View.new(...).save
      model_view.increment_counter(:views, data.id)

    else
      if (DateTime.now - last_view.created_at.to_datetime) > 1.day
        model_view+View.new(...).save
        model_view.increment_counter(:views, data.id)
      end
    end #comparing dates
  end
end

并像这样调用这个方法:

@photo = Photo.find(params[:id])
Func.check_views('Photo', @photo)

当我尝试使用上面的方法时,我会得到错误 undefined method `check_views' for Func(Table doesn't exist):Class

你能给我一个帮助,如何使它工作? 谢谢

【问题讨论】:

  • 所以Func 没有桌子?
  • 不,Func 应该只是一个辅助模型

标签: ruby-on-rails-3 methods model action


【解决方案1】:

您可以使用ActiveRecord::Concern 和模块将常用功能移到一个位置,如下所示:

module CheckViews

  extend ActiveSupport::Concern


  module ClassMethods
    # all class methods go here, if you don't have any just leave it blank
  end

  def check_views(data)
    last_view = where('ip_address = ? AND request_url = ?', request.remote_ip, request.url).order('created_at DESC').first

    unless last_view
      @@views_class.new(...).save
      increment_counter(:views, data.id)

    else
      if (DateTime.now - last_view.created_at.to_datetime) > 1.day
        @@views_class.new(...).save
        increment_counter(:views, data.id)
      end
    end #comparing dates
  end

end


class Photo < ActiveRecord::Base
  include CheckViews

end  

您现在可以执行以下操作:

@photo = Photo.find(params[:id])
@photo.check_views

【讨论】:

    【解决方案2】:

    我很想将其作为一个扩展需要 Views 功能的类的模块。像下面这样的东西应该工作;但它完全未经测试,完全不同于我以前做过的任何事情,所以它可能完全是错误的。公平警告。

    module CheckViews
    
      def self.extended(host_class)
        host_class.class_variable_set("@@views_class", "#{host_class}View".constantize)
      end
    
      def check_views(data)
        last_view = where('ip_address = ? AND request_url = ?', request.remote_ip, request.url).order('created_at DESC').first
    
        unless last_view
          @@views_class.new(...).save
          increment_counter(:views, data.id)
    
        else
          if (DateTime.now - last_view.created_at.to_datetime) > 1.day
            @@views_class.new(...).save
            increment_counter(:views, data.id)
          end
        end #comparing dates
      end
    end
    
    class Photo < ActiveRecord::Base
      extend CheckViews
      ...
    end
    

    (extend将目标Module的所有实例方法添加为调用类的类方法;所以Photo获得Photo.check_views(data),而该函数中的self就是类Photo。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 2021-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多