说我有具有附接的状态下的关联:有什么用途:belongs_to关联的条件是什么?
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 doc states使得:上belongs_to的条件选项:
指定该 相关联的对象必须按顺序 符合条件被包括为WHERE SQL 片段,例如授权= 1。
但是输出在select上没有显示WHERE子句,并且在任何情况下我都希望在belongs_to上这样的条件会阻止以INSERT而不是SELECT开头的关系开始。这个选项似乎对belongs_to关联没有影响,除非我遗漏了一些东西。该选项在has_many上有意义,我只是看不出它适用于belongs_to。
编辑:进一步的研究显示,你确实可以坚持一个违反条件的关联,但你不能在之后检索关联记录记录被重新加载。
像这样定义一个类:
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>
这两个无效的bloops都保留在内存中。
>> 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>
似乎很奇怪我,但你去那里。
谢谢你,非常有帮助。 – 2010-01-28 20:15:04