Скажите, у меня есть следующая связь с приложенным условием:
belongs_to :admin_user,
:class_name => 'User',
:foreign_key => :admin_user_id,
:conditions=> 'users.admin=TRUE' # or any variation with hash or array, {:admin => true}, etc.
Документ API заявляет , что опция: condition для assign_to будет:
Укажите условия, при которых
связанный объект должен встретиться в порядке
быть включенным в качестве WHERE SQL
фрагмент, такой как санкционированный = 1.
Но в выводе отсутствует предложение WHERE для выбора, и в любом случае я ожидал бы, что такие условия для объекта own_to будут препятствовать сохранению этой взаимосвязи для начала, для INSERT, а не для SELECT. Эта опция, кажется, не влияет на ассоциацию own_to, если я что-то упустил. Опция имеет смысл для has_many, я просто не понимаю, как она применяется к принадлежащему.
РЕДАКТИРОВАТЬ: Дальнейшие исследования показывают, что вы действительно можете сохранить ассоциацию, которая нарушает условие, но вы не можете получить связанную запись после запись перезагружается.
В классе, определенном так:
class Widget < ActiveRecord::Base
belongs_to :big_bloop,
:class_name => "Bloop",
:foreign_key => :big_bloop_id,
:conditions => ["big_bloop = ?", true]
belongs_to :bloop, :conditions => ["big_bloop = ?", true]
end
... из консоли видим:
>> bloop = Bloop.new
=> #<Bloop id: nil, name: nil, big_bloop: nil>
>> widget = Widget.new
=> #<Widget id: nil, name: nil, bloop_id: nil, big_bloop_id: nil>
>> widget.bloop = bloop
=> #<Bloop id: nil, name: nil, big_bloop: nil>
>> widget.save!
=> true
>> widget
=> #<Widget id: 2, name: nil, bloop_id: 2, big_bloop_id: nil>
Я связал bloop, который нарушает условие, и сохранил его. Ассоциация сохраняется в БД (см. Bloop_id и big_bloop_id в последней строке выше).
>> big_bloop = Bloop.new
=> #<Bloop id: nil, name: nil, big_bloop: nil>
>> widget.big_bloop = big_bloop
=> #<Bloop id: nil, name: nil, big_bloop: nil>
>> widget.save!
=> true
>> widget
=> #<Widget id: 2, name: nil, bloop_id: 2, big_bloop_id: 3>
То же самое, другой атрибут.
>> widget.bloop
=> #<Bloop id: 2, name: nil, big_bloop: nil>
>> widget.big_bloop
=> #<Bloop id: 3, name: nil, big_bloop: nil>
Оба недействительных сообщения остаются в памяти.
>> widget.reload
=> #<Widget id: 2, name: nil, bloop_id: 2, big_bloop_id: 3>
>> widget.bloop
=> nil
>> widget.big_bloop
=> nil
После перезагрузки они исчезли, потому что оператор SELECT действительно использует предложение WHERE для их исключения.
Bloop Load (0.3ms) SELECT * FROM `bloops` WHERE (`bloops`.`id` = 2 AND (big_bloop = 1))
И все же виджет все еще имеет ссылки:
>> widget
=> #<Widget id: 2, name: nil, bloop_id: 2, big_bloop_id: 3>
Мне кажется странным, но вот, пожалуйста.