J'ai trouvé une situation inhabituelle sur les rails 3 app.Rails has_many à travers?/vide?
Soit le modèle:
class Genre < ActiveRecord::Base
has_many :banner_genres, :dependent => :destroy
has_many :banners, :through => :banner_genres
...
class BannerGenre < ActiveRecord::Base
attr_accessible :banner_id, :banner, :genre_id, :genre, :position
belongs_to :genre
belongs_to :banner
...
class Banner < ActiveRecord::Base
has_many :banner_genres, :dependent => :destroy
has_many :genres, :through => :banner_genres
...
Maintenant, si j'ai un genre avec une bannière, je reçois les lignes suivantes dans la console Rails:
1.9.3p362 :005 > g = Genre.find 62
Genre Load (0.8ms) SELECT "genres".* FROM "genres" WHERE "genres"."id" = $1 LIMIT 1 [["id", 62]]
=> #<Genre id: 62, ...
1.9.3p362 :006 > g.banner_genres.any?
(0.5ms) SELECT COUNT(*) FROM "banner_genres" WHERE "banner_genres"."genre_id" = 62
=> true
1.9.3p362 :007 > g.banners
Banner Load (1.0ms) SELECT "banners".* FROM "banners" INNER JOIN "banner_genres" ON "banners"."id" = "banner_genres"."banner_id" WHERE "banner_genres"."genre_id" = 62 ORDER BY position
=> [#<Banner id: 446, ...
1.9.3p362 :008 > g.banners.any?
=> false
Pourquoi les .any?
retours false
? Je suis avec un autre à travers l'association sur le même projet et il renvoie true
.
Edit:
J'ai eu une faute de frappe lors du passage du code ici. C'est banner_genres sur le has_many. Pas genre_banners.
également l'association inverse fonctionne comme il est censé:
1.9.3p362 :004 > b = Banner.find 446
Banner Load (1.1ms) SELECT "banners".* FROM "banners" WHERE "banners"."id" = $1 ORDER BY position LIMIT 1 [["id", 446]]
=> #<Banner id: 446...
1.9.3p362 :005 > b.genres.any?
(0.8ms) SELECT COUNT(*) FROM "genres" INNER JOIN "banner_genres" ON "genres"."id" = "banner_genres"."genre_id" WHERE "banner_genres"."banner_id" = 446
=> true
Edit 2
Plus sortie étrange de la console:
1.9.3p362 :007 > g.banners.class
=> Array
1.9.3p362 :008 > g.banners.any?
=> false
1.9.3p362 :004 > g.banners.any? {|b| b}
=> true
1.9.3p362 :006 > g.banners.count
(0.9ms) SELECT COUNT(*) FROM "banners" INNER JOIN "banner_genres" ON "banners"."id" = "banner_genres"."banner_id" WHERE "banner_genres"."genre_id" = 62
=> 1
1.9.3p362 :009 > g.banners.to_a.any?
=> true
Edit 3
g.banner_genres
BannerGenre Load (0.7ms) SELECT "banner_genres".* FROM "banner_genres" WHERE "banner_genres"."genre_id" = 62
=> [#<BannerGenre id: 4, genre_id: 62, banner_id: 446, position: 1, created_at: "2013-03-15 16:41:10", updated_at: "2013-03-15 16:41:10">]
Modifier 4 Posée par Aleks
pourriez-vous s'il vous plaît montrer les requêtes qui sont affichées sur g.banners.any? et g.banners. C'est exactement la même requête, ce qui est encore plus étrange. Je n'ai pas non plus outrepassé le any? méthode n'importe où.
1.9.3p362 :037 > g.banners(true)
Banner Load (1.0ms) SELECT "banners".* FROM "banners" INNER JOIN "banner_genres" ON "banners"."id" = "banner_genres"."banner_id" WHERE "banner_genres"."genre_id" = 62 ORDER BY position
=> [#<Banner id: 446, ...
1.9.3p362 :038 > g.banners(true).any?
Banner Load (1.2ms) SELECT "banners".* FROM "banners" INNER JOIN "banner_genres" ON "banners"."id" = "banner_genres"."banner_id" WHERE "banner_genres"."genre_id" = 62 ORDER BY position
=> false
1.9.3p362 :039 > g.banners.method(:any?)
=> #<Method: Array(Enumerable)#any?>
Juste d'intérêt, est-il censé être 'has_many: genre_banners, has_many: bannières, : through =>: banner_genres'? Je m'attendais à ce que ': has_many' et': through' soient les mêmes. – omnikron
pouvez-vous nous donner toutes les informations sur les associations sur ce modèle? Soit vous devez avoir ': through =>: genre_banners' ou vous ne fournissez pas assez d'informations – Zippie
@Zippie, j'ai ajouté l'info des 2 autres modèles – dcarneiro