我是RoR的超级新手。现在我正在研究这个有趣的Rails for Zombies练习。我遇到了一些语法问题......
我的代码是:
Weapon.where(:zombie => "Ash")
但它不起作用。如果我改为输入:
Weapon.find(1)
我通过了(因为第一种武器无论如何属于僵尸Ash)。
我的问题是,我对这个.where()方法的回答有什么问题?
提前致谢。
答案 0 :(得分:8)
您应该按如下方式嵌套查询:
Weapon.where(:zombie => {:name => "Ash"})
那会给你属于名为'Ash'的僵尸的武器
答案 1 :(得分:4)
如果像我一样,你试图通过僵尸模型尝试这个,你需要使用第一个方法。这是因为 where()会返回一个Zombies集合。
即
Zombie.where(:name => "Ash").first.weapons
本教程仍然教授旧的哈希语法,但自从Ruby 1.9以来,您可以(并且应该)使用新的简化格式。这种语法甚至可以在Zombies教程中使用:
Zombie.where(name:"Ash").first.weapons
答案 2 :(得分:3)
如果你想要一个where子句你 现在返回一个值,然后你可以写
Zombie.where(:name => "ash").first
答案 3 :(得分:2)
不确定,也是Rails3查询的新手,但:zombie 并不希望匹配僵尸对象,而不是它的名字。
我会做Zombie.where(:name => "Ash").weapons
答案 4 :(得分:2)
如果需要单个对象,通常使用Model.find( )
,如果找不到,则返回nil。而Model.where({:field => value})
返回符合条件的对象数组。
答案 5 :(得分:2)
他们打算这样做(基于视频)
ash = Zombie.find(1) ash.weapons
哪个应该返回灰拥有的所有武器的数组。我试了很久才使用count方法然后我意识到他们只是想要实际的武器项目(数组/列表/无论它是什么,我只是从c ++和python背景开始使用rails)
答案 6 :(得分:2)
我今天遇到了同样的问题,但接受的答案对我不起作用。我不知道自2010年以来API是否发生了变化,但我通过这样做得到了它:
Weapon.joins(:zombie).where(:zombies => {:name => "Ash"})
你也可以通过加入另一个方向获得相同的结果,虽然我认为第一个解决方案是问题所在:
Zombie.where(:name => 'Ash').first.weapons
答案 7 :(得分:1)
由于僵尸表链接到武器表,您可以使用以下代码: Zombie.find(1).weapons.all
仅供参考 - Zombie ID 1 = Ash
答案 8 :(得分:1)
Weapon.where(:zombie_id =>'1') => [#]
答案 9 :(得分:1)
Zombie.where(:name => "Ash").first.weapons
恕我直言:我认为这种方式更为明确:首先,我们正在寻找一个僵尸,然后 - 想要拿第一个武器。
当然,你可以通过zombie的id(Weapon.where(:zombie_id => SOME_ZOMBIE_ID))寻找武器,但是对我来说 - 这不是我想要看到的东西半年后我的代码 - 它是关于更多的编码和浪费更多的理解时间。
ps:似乎我的答案是Gerry答案的缩短版本(见上文) - 抱歉:)
答案 10 :(得分:1)
在此上下文中,您可以尝试以下代码:
z = Zombie.find("ID")
Weapon.where(:zombie_id => z)
答案 11 :(得分:1)
Weapon.where(:zombie_id => Zombie.where(:name => "Ash"))
您可以从DB武器中选择,zombie_id
,其名称是来自DB Zombie的Ash。
答案 12 :(得分:0)
我认为你通过使用Weapon.find(1)
,因为武器表中只有一种武器,但是如果你创造了另一种武器,则使用:id => 1然后你的原始语法不起作用 - 因为它只返回第一个武器而不是所有武器。
我通过了使用,Zombie.find(1).weapons
将返回与以下相关联的武器的多个条目:id = 1,但是也在考虑与您相同并且想要搜索:名称而不是:id。
我也在考虑使用“where”属性,但无法使其工作 - 当我使用@edgerunner回答它时:
#<ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: zombie.name: SELECT "weapons".* FROM "weapons" WHERE "zombie"."name" = 'Ash'>
所以我不确定这是否是通过程序的限制或什么 - 因为它,我仍然有点困惑。
答案 13 :(得分:0)
答案是Zombie.find(1).weapons
..然后你将成功找到所有Ash的武器。