我在rails 3应用程序上发现了一个不寻常的情况。
考虑以下模式:
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
...现在,如果我有一个带有横幅的类型,那么在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 为什么.any?返回false?我通过在同一个项目上的关联使用另一个has_many,它返回true。
编辑:
我在这里传递代码时出错了。我是banner_genres on has_many。不是genre_banners。
另外,逆关联的工作原理是:
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 编辑2
更奇怪的控制台输出:
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 编辑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">]阿列克斯要求的编辑4
请您显示g.banners.any上显示的查询好吗?和g.banners。这是完全相同的查询,甚至更奇怪。我也没有推翻任何?方法在任何地方。
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?> 发布于 2013-03-19 11:14:13
这里真正的问题不是关联是好的还是坏的,而是为什么要显示包含元素的数组的false。很明显,它正在返回值,但问题是为什么要返回false。
解释可能就在这里:Unable to get Ruby's #any? to return false with list of nil objects
看看any?是如何实现的,以及它如何与您的问题相关,它可能会给您一个提示。
也请参阅此链接:http://apidock.com/ruby/Enumerable/any%3F
编辑:
您要说的是:首先,您有一个objects数组。哪个将在any?上返回false
但是如果你做.to_a,你会做这样的事情:
Time.new.to_a #=> [39, 54, 8, 9, 4, 2013, 3, 99, true, "CET"]这就是为什么它将返回true,因为您将拥有非空的对象。
编辑2
注意:如果数组中的所有对象都是any?或false,则false将返回
发布于 2013-03-19 11:58:23
any?应该把true还给我..。我对这个问题很好奇,所以我决定模拟它。
g = Genre.find 1
Genre Load (30.1ms) SELECT "genres".* FROM "genres" WHERE "genres"."id" = $1 LIMIT 1 [["id", 1]]
=> #<Genre id: 1, name: "a", created_at: "2013-03-19 11:44:32", updated_at: "2013-03-19 11:44:32">
g.banner_genres.any?
(0.3ms) SELECT COUNT(*) FROM "banner_genres" WHERE "banner_genres"."genre_id" = 1
=> true
g.banners
Banner Load (0.5ms) SELECT "banners".* FROM "banners" INNER JOIN "banner_genres" ON "banners"."id" = "banner_genres"."banner_id" WHERE "banner_genres"."genre_id" = 1
=> [#<Banner id: 1, name: "1", created_at: "2013-03-19 11:43:00", updated_at: "2013-03-19 11:43:00">, #<Banner id: 2, name: "2", created_at: "2013-03-19 11:43:59", updated_at: "2013-03-19 11:43:59">]
g.banners.any?
=> true 另外,
g.banners.class
=> Array
g.banners.any?
=> true
g.banners.to_a.any?
=> true 你的代码里有别的东西..。
https://stackoverflow.com/questions/15497256
复制相似问题