2012-02-22 10 views
0

私は、ビューを確認するための2つのテーブル(ページの訪問) - ギャラリーと写真家(PhotosView)のpic(PhotoView)のビューを持っています。 これら二つのモデル(とテーブル)は同じなので、私は彼らのためにモデルを作成したい - のようなもの:Rails 3 - 自分のモデルを作成して他の人と作業する

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) 

上記の方法で、私はエラーFunc(テーブルは存在しません)の `check_views '未定義のメソッドを取得します:クラス

私はそれを動作させる方法を教えてください。 ありがとうございました

+0

だから、 'Func'にはテーブルがありませんか? – pduersteler

+0

いいえ、 'Func'は補助モデルと同じでなければなりません – user984621

答えて

1

あなたはActiveRecord::Concernを使用することができます。

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 

(クラスPhotoあるのでPhoto利益Photo.check_views(data)、その関数内selfextendは、クラスの呼び出し元のクラスのメソッドとしてターゲットModuleのすべてのインスタンスメソッドが追加されます。)モジュールを使用して、次のように共通機能を1か所に移動できます。

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 
1

私は非常に、ビューの機能を必要とするクラスを拡張するモジュールとしてこれを行うと思います。次のようなものがありますでなければなりません。それは完全にテストされていないと私は今までに何をしたことが全く異なりますのでかもしれない完全にバグしてください。公正警告。

関連する問題