2011-06-05 60 views
0

我有這個模型叫Request,其中belongs_to a Userbelongs_to上的條件

class Request < ActiveRecord::Base  
    belongs_to :user, :conditions => "can_make_requests = t" 
end 

User模型在其架構命名can_make_requests一個布爾領域,但由於某些原因,當我嘗試

aUser.requests.create 

aUsercan_make_requestsf,它仍然有效(aUser.requests.first返回新提出要求)。有誰知道這個問題是什麼?

回答

1

您在使用User#requests關聯關係,該關聯對Request#user的條件沒有任何線索。

aUser.requests.create根據requests關聯中給出的任何條件構建並保存Request對象,並將其添加到關聯請求列表中。

當然,Request恰好有一個user關聯,但在您的示例中從未使用過。

是的,它會導致怪異的行爲和矛盾:

>> user = User.create(:can_make_requests => false) 
=> #<User id: 3, can_make_requests: false> 
>> request = user.requests.create 
=> #<Request id: 2, user_id: 3> 
>> request.user 
=> nil 
>> user.requests 
=> [#<Request id: 2, user_id: 3] 

如果你想使用驗證從請求級別執行它,你可以這樣做:

class Request < ActiveRecord::Base 
    validates :user, :presence => true 
    validate :user_can_make_requests 

    def user_can_make_requests 
    errors[:user] << 'cannot make requests' if user && !user.can_make_requests? 
    end 
end 
+0

是否有辦法通過使用驗證來強制執行此操作?強制它,以便當保存請求時,它必須有一個'user_id','user_id'引用的'User'必須具有':can_make_requests => true'? – Echostar 2011-06-05 16:46:45

+0

以一種方式更新了我的答案 – 2011-06-06 09:20:17

1

對於PostgreSQL(以及Rails中的SQLite),您希望't'爲真,而不僅僅是t。當然,對於MySQL,你想要1。試着改變你的:conditions這樣:

belongs_to :user, :conditions => [ 'can_make_requests = ?', true ] 

或者:

belongs_to :user, :conditions => { :can_make_requests => true } 

這應該讓你對你使用任何數據庫的適當真正價值。