Условия на принадлежат - PullRequest
0 голосов
/ 05 июня 2011

У меня есть эта модель под названием Request, которая belongs_to a 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 возвращает вновь сделанный запрос). Кто-нибудь знает в чем проблема?

Ответы [ 2 ]

1 голос
/ 05 июня 2011

Вы используете ассоциацию 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
1 голос
/ 05 июня 2011

Для PostgreSQL (и SQLite под Rails) вы бы хотели 't' для true, а не просто t.Конечно, для MySQL вы бы хотели 1.Попробуйте изменить :conditions на это:

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

Или:

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

Это должно дать вам подходящее истинное значение для любой используемой вами базы данных.

...