Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何正确选择联接表中的字段?_Ruby On Rails_Ruby On Rails 4_Activerecord_Rails Activerecord - Fatal编程技术网

Ruby on rails 如何正确选择联接表中的字段?

Ruby on rails 如何正确选择联接表中的字段?,ruby-on-rails,ruby-on-rails-4,activerecord,rails-activerecord,Ruby On Rails,Ruby On Rails 4,Activerecord,Rails Activerecord,这是我的简化模型,我加入了模型 样板房 has_many :towers 及 模型塔 belong_to :apartment 然后我尝试在controller中连接这两个表,在rails控制台中也尝试过,如下所示: 公寓。连接:塔楼。选择“公寓。id”,“公寓。名称”,“塔楼。id”,“塔楼。名称” 问题在于上面的查询只返回 公寓.id和公寓.name 也试过用这样的别名,还是没有运气 公寓.连接:塔楼.选择'apartments.id'、'apartments.name',

这是我的简化模型,我加入了模型

样板房

   has_many :towers

模型塔

   belong_to :apartment
然后我尝试在controller中连接这两个表,在rails控制台中也尝试过,如下所示:

公寓。连接:塔楼。选择“公寓。id”,“公寓。名称”,“塔楼。id”,“塔楼。名称”

问题在于上面的查询只返回

公寓.id和公寓.name

也试过用这样的别名,还是没有运气

公寓.连接:塔楼.选择'apartments.id'、'apartments.name', “towers.id为towerid”,“towers.name为towername”

我已经确认所有的塔楼都有一套公寓,我知道我可以这样做来创造一项记录

公寓.连接:塔楼.选择'apartments.id'、'apartments.name', “towers.id”“towers.name”“first.towers.id”

等等,但我需要所有记录和所有这些字段,请提供建议

以下是我在rails控制台中得到的最新结果:

 Apt Load (1.0ms)  SELECT apts.id, apts.apt_name, towers.id as towerid, towers.
    tower_name as towername FROM `apts` INNER JOIN `towers` ON `towers`.`apt_id` = `
    apts`.`id`
    => #<ActiveRecord::Relation [#<Apt id: 5, apt_name: "basura">, #<Apt id: 5, apt_
    name: "basura">, #<Apt id: 124, apt_name: "hydra">, #<Apt id: 124, apt_name: "hy
    dra">, #<Apt id: 126, apt_name: "mediterania">, #<Apt id: 126, apt_name: "mediterania">, #<Apt id: 142, apt_name: "apartement gajah mada">, #<Apt id: 142, apt_name: "apartement gajah mada">]>
如您所见,上面的查询只返回2个字段,我需要如下结果:

#<Apt id: 126, apt_name: "mediterania", tower_id: 12, tower_name: "tower A">, 
#<Apt id: 126, apt_name: "mediterania", tower_id: 15, tower_name: "tower F">
etcc…

您应该使用

Apartment.joins(:towers).select('apartments.id, apartments.name, towers.id , towers.name')
这是单个字符串中的所有列名


我认为这是可能的唯一方法是使用as

为什么first.towers.id不起作用

apartment.towers将返回ActiveRecord::Associations::CollectionProxy。你可以把它看作是一个塔的集合。在SQL查询中,您指的是towers表。但当您运行公寓.towers.id时,您正在调用CollectionProxy对象上的id,该对象将不起作用。你可以使用塔楼获得第一座塔楼

关于,

Apt Load (1.0ms)  SELECT apts.id, apts.apt_name, towers.id as towerid, towers.
    tower_name as towername FROM `apts` INNER JOIN `towers` ON `towers`.`apt_id` = `
    apts`.`id`
    => #<ActiveRecord::Relation [#<Apt id: 5, apt_name: "basura">, #<Apt id: 5, apt_
    name: "basura">, #<Apt id: 124, apt_name: "hydra">, #<Apt id: 124, apt_name: "hy
    dra">, #<Apt id: 126, apt_name: "mediterania">, #<Apt id: 126, apt_name: "mediterania">, #<Apt id: 142, apt_name: "apartement gajah mada">, #<Apt id: 142, apt_name: "apartement gajah mada">]>

上面的语句将获取数组中的所有数据。使用select得到的结果与select相同,但select不会加载数组中的所有数据

您可以尝试以下别名

Apartment.joins(:towers).select('apartments.id as apartment_id, apartments.name as apartment_name, towers.id as tower_id , towers.name as tower_name)
你可以试试这个

公寓。连接:塔楼。选择“公寓。id为id,公寓。名称为公寓\名称,塔楼。id为塔楼\ id,塔楼。名称为塔楼\名称”

你会得到这样的回答 ActiveRecord::关系[,,
]>

您可以发布生成的sql查询吗?或者,如果您正在控制台中尝试,只需在末尾添加.to_sql并查看它是否生成正确的查询。现在:=>从塔楼上的apts内部连接塔楼中选择apts.id、apts.apt_名称、towers.id、tower.tower_名称。apt_id=apts.id这有点奇怪,因为我可以看到查询是正确生成的,但不知何故,查询结果并没有反映出这一点。哦,顺便说一句,我还尝试用我的第一种方法检查生成的查询,所有字段都是分隔字符串,它也返回与您的方法相同的查询。是的,它很奇怪。顺便问一下,您是否编辑了结果并将公寓替换为apts,或者您的表名是这样的?您可以直接通过mysql控制台或任何GUI(如phpMyAdmin)运行此查询,并查看其是否正确返回结果。实际上,我的真实模型名为apts,但为了使其更易于理解,因此我将其作为单元编写,我在sql workbench中运行了生成的查询,结果正是我所需要的,但不知何故,它在rails中不起作用。使用“includes”代替“join”仅用于您的信息。first.towers.id不起作用,你必须先写。id@GauravGupta尝试在rails控制台中使用includes时,会抛出一个错误未知列“towers.tower_name”@HendraLim它将不起作用,因为towers是activerecord关系,您必须先执行towers.first。name@Dinesh它不是只返回一条记录吗?请您在回答部分给出一个完整的建议示例。它确实返回了塔名,但问题是它只返回了1条记录,我需要的是返回这样的数据,等等。@HendraLim您拥有它,就像您想要的一样。在控制台中,它将只显示Apt模型中存在的列。我以前使用过Pulk,但由于它返回数组而不是ORM对象,它并不能解决我的问题,顺便说一句,我已经解决了我的问题,我想你是对的,我仍然可以访问塔名和id字段,即使它没有显示在控制台中,向上投票,谢谢你的帮助。试试这个。platform.joinsOUTER连接塔楼上的塔楼。platform_id=platforms.id。选择'platforms.id作为公寓_id,platforms.name作为公寓_name,towers.id作为塔楼_id,towers.name作为塔楼_name
Apartment.joins(:towers).pluck('apartments.id, apartments.name, towers.id as t_id, towers.name as t_name')
Apartment.joins(:towers).select('apartments.id as apartment_id, apartments.name as apartment_name, towers.id as tower_id , towers.name as tower_name)