2011-10-30 29 views
0

年長則n分鐘前所有用戶我有User模型和Group模型。 User belongs_to GroupGroup有一個屬性check_minutesRails的:如何找到其中n存儲在加入了羣

我想創建一個用戶模型中的兩個範圍:oldfresh。老用戶是created_at之前的用戶,比user.group.check_minutes.ago舊。新用戶是created_atuser.group.check_minutes.ago更新的用戶。

我寫的範圍:

scope :old, joins(:group).where("`users`.`created_at` <= 
     DATE_SUB(NOW(), INTERVAL `groups`.`check_minutes` MINUTE)") 
    scope :fresh, joins(:group).where("`users`.`created_at` > 
     DATE_SUB(NOW(), INTERVAL `groups`.`check_minutes` MINUTE)") 

和規格:

describe "scopes" do 
    let(:group) {Group.make :check_minutes => 20} 
    let(:old_user) {User.make :group => group, :created_at => 30.minutes.ago} 
    let(:new_user) {User.make :group => group, :created_at => 10.minutes.ago} 

    context "#fresh" do 
     it "should scope all new users" do 
     User.fresh.should eq([ new_user ]) 
     end 
    end 
    context "#old" do 
     it "should scope all old users" do 
     User.old.should eq([ old_user ]) 
     end 
    end 
    end 

規格上失敗fresh(爲old它是確定):

expected [#<User id: 7967, ... >] 
     got [] 

有什麼不對?如何強制我的範圍\規格工作良好?

如果你知道更好的方式來組織範圍這將是偉大的!

回答

2

你的範圍都OK。

您遇到的問題是,在數據庫中存儲的Rails UTC時間值regardlessly數據庫配置的時區,並將其轉換成你的(Rails)的時區,而這樣做的ORM。

......這意味着你的示波器是差不多行 - 你只需要在查詢中注入'Rails'當前時間。

scope :old, lambda { joins(:group).where(["`users`.`created_at` <= 
    DATE_SUB(?, INTERVAL `groups`.`check_minutes` MINUTE)", Time.zone.now]) } 
scope :fresh, lambda { joins(:group).where(["`users`.`created_at` > 
    DATE_SUB(?, INTERVAL `groups`.`check_minutes` MINUTE)", Time.zone.now]) } 
+0

對不起被連接在SO俄羅斯的文章,但我已經在我的博客涵蓋這樣的:http://leonid.shevtsov.me/ru/time-now-vs-time-zone-now-in -rails –

+0

真的很好,+1 – apneadiving

+0

謝謝!有用。文章非常有用! Спасибо:) – petRUShka

相關問題