我有一个名为Request
的模型,belongs_to
一个User
。
class Request < ActiveRecord::Base
belongs_to :user, :conditions => "can_make_requests = t"
end
User
模型在其模式中有一个名为can_make_requests
的布尔字段,但出于某种原因,当我尝试
aUser.requests.create
当aUser
can_make_requests
为f
时,它仍然有效(aUser.requests.first
会返回新制作的请求)。有谁知道这是什么问题?
答案 0 :(得分:1)
对于PostgreSQL(以及Rails下的SQLite),您希望't'
为true,而不仅仅是t
。当然,对于MySQL,你需要1
。尝试将:conditions
更改为:
belongs_to :user, :conditions => [ 'can_make_requests = ?', true ]
或者:
belongs_to :user, :conditions => { :can_make_requests => true }
对于您正在使用的数据库,这应该为您提供适当的真实值。
答案 1 :(得分:1)
您正在使用User#requests
关联,该关联对Request#user
上的条件一无所知。
aUser.requests.create
根据Request
关联中给出的任何条件构建并保存requests
对象,并将其添加到关联请求列表中。
当然,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