2012-02-22 39 views
0

工作,我有檢查的意見(頁面訪問)兩個表 - 觀點的PIC(PhotoView中)在畫廊和攝影師(PhotographerView)。 因爲這兩款車型(和表格)是一樣的,我想創建一個模型爲他們 - 是這樣的:的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) 

當我嘗試使用它與上面的方式,我會得到錯誤未定義的方法`check_views'爲Func(表不存在):類

你能給我一個幫助,如何使其工作? 謝謝

+0

所以'Func'沒有一個表? – pduersteler 2012-02-22 15:20:55

+0

不,'Func'應該就像一個輔助模型 – user984621 2012-02-22 15:25:00

回答

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 
1

我會非常想這樣做的延伸的希望瀏覽功能的類的模塊。像下面的應該工作;但它是完全未經測試,完全不同於任何以前那麼它可能完全馬車我做過。公平的警告。

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。)