关于belongs_to的条件

时间:2011-06-05 06:51:10

标签: ruby ruby-on-rails-3 model associations

我有一个名为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_requestsf时,它仍然有效(aUser.requests.first会返回新制作的请求)。有谁知道这是什么问题?

2 个答案:

答案 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