Ruby on Rails语法问题

时间:2010-12-30 07:57:04

标签: ruby-on-rails ruby-on-rails-3

我是RoR的超级新手。现在我正在研究这个有趣的Rails for Zombies练习。我遇到了一些语法问题......

我的代码是:

Weapon.where(:zombie => "Ash")

但它不起作用。如果我改为输入:

Weapon.find(1)

我通过了(因为第一种武器无论如何属于僵尸Ash)。

我的问题是,我对这个.where()方法的回答有什么问题?

提前致谢。

alt text

alt text

alt text

14 个答案:

答案 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.joi­ns(:zombie­).where(:z­ombies => {:nam­e => "Ash"­})

你也可以通过加入另一个方向获得相同的结果,虽然我认为第一个解决方案是问题所在:

Zombie.whe­re(:name => 'Ash'­).first.we­apons

答案 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.whe­re(:zombie­_id => Zombi­e.where(:n­ame => "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的武器。