Dire que j'ai l'association suivante avec une condition attachée:Quel est l'objectif de: conditions sur une association 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.
Le API doc states que: conditions option belongs_to seront:
Spécifiez les conditions que l'objet associé doit satisfaire à inclure en tant que fragment WHERE SQL , tel que autorisé = 1.
Mais la sortie ne montre aucune clause WHERE sur le select, et dans tous les cas je m'attendrais à ce que des conditions comme celle-ci sur un belongs_to empêchent la poursuite de cette relation, sur l'INSERT et pas sur le SELECT. Cette option semble n'avoir aucun effet sur une association belongs_to, à moins de manquer quelque chose. L'option a du sens sur un has_many, je ne vois tout simplement pas comment cela s'applique à belongs_to.
EDIT: D'autres recherches révèlent que vous pouvez en effet persister une association qui enfreint une condition, mais vous ne pouvez pas récupérer l'enregistrement associé après l'enregistrement est rechargé.
Sur une classe définie comme ceci:
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
... à partir de la console, nous voyons:
>> 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>
J'ai associé un bloop qui viole la condition et l'a sauvé. L'association est conservée dans la base de données (voir bloop_id et big_bloop_id sur la dernière ligne ci-dessus).
>> 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>
Même chose, attribut différent.
>> widget.bloop
=> #<Bloop id: 2, name: nil, big_bloop: nil>
>> widget.big_bloop
=> #<Bloop id: 3, name: nil, big_bloop: nil>
Les deux bloops invalides restent en mémoire. Après le rechargement, ils ont disparu, car l'instruction SELECT utilise en effet une clause WHERE pour les exclure.
Bloop Load (0.3ms) SELECT * FROM `bloops` WHERE (`bloops`.`id` = 2 AND (big_bloop = 1))
Et pourtant, le widget a encore les références:
>> widget
=> #<Widget id: 2, name: nil, bloop_id: 2, big_bloop_id: 3>
semble étrange pour moi, mais là vous allez.
Merci pour cela, très utile. –