Rails 4 .joins()问题 - 无法正常工作

时间:2013-08-23 18:22:29

标签: mysql sql ruby-on-rails ruby activerecord

插件模型:

class Plugin < ActiveRecord::Base
    has_many :vulns
end

Vuln模型:

class Vuln < ActiveRecord::Base
    belongs_to :plugin
end

插件表:

create_table "plugins", force: true do |t|
    t.string "name"
end

Vuln表:

create_table "vulns", force: true do |t|
    t.string  "title"
    t.integer "plugin_id"
    t.string  "vulnerability_type"
    t.string  "fixed_in"
end

当我使用rails c使用rails控制台并输入Plugin.select("*").joins(:vulns)时,它只会从插件表中获取数据

#<ActiveRecord::Relation [#<Plugin id: 1, name: "xxx">, #<Plugin id: 2, name: "xxx">

这是查询:

SELECT * FROM `plugins` INNER JOIN `vulns` ON `vulns`.`plugin_id` = `plugins`.`id`

但是,当我在mysql中执行此查询时,它会显示来自其所有内容的所有内容。对于每个插件,数据库中至少有一个或多个vuln。

这就是问题所在:如何让它从两个表(插件和版本)中获取内容而不仅仅是插件?

1 个答案:

答案 0 :(得分:1)

vulns值存在,因为您使用Plugin模型进行选择,即Plugin.select("*").joins(:vulns),所以它不会显示。

如果您执行了以下操作,您将获得以下值:

> plugin = Plugin.select("*").joins(:vulns)
> plugin.first.title 
=> "mytitle"

由于您要查询Plugin模型,因此您会看到Plugin对象。

测试此方法的另一种方法是执行以下操作:

> plugin = Plugin.select([:name, :title]).joins(:vulns)
=> #<ActiveRecord::Relation [#<Plugin id: 1, name: "xxxx">]>

# It won't show you title even though it's there
> plugin.title
=> "mytitle"