这是我的简化模型,我有连接模型,
样板房
has_many :towers
和
模型塔
belong_to :apartment
然后我尝试在controller中连接这两个表,也尝试在rails控制台中连接,如下所示:
公寓.joins(:towers).select('公寓. id','公寓.名称','塔楼. id','塔楼.名称')
问题是上面查询只返回
apartments.id 和apartments.name
我也试过用这样的别名,还是不行
公寓.joins(:towers).select('公寓. id','公寓. name','塔楼. id作为塔楼id','塔楼. name作为塔楼名称')
我已经确认,所有塔有一个公寓,我知道我可以这样做,以获得1记录
公寓.joins(:towers).select('公寓. id','公寓.名称','塔楼. id','塔楼.名称').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">
等等...
5条答案
按热度按时间vyswwuz21#
我认为唯一可行的方法是使用
as
为什么first.towers.id无法运行?
apartment.towers
将返回ActiveRecord::Associations::CollectionProxy
。您可以将其视为塔的集合。在SQL查询中,您将引用towers
表。但当您运行www.example.com时apartment.towers.id,您将调用CollectionProxy对象上的id,该对象将不起作用。您可以使用towers.first
获取第一个塔。关于
**您在控制台中看到的是
inspsect
方法返回的结果。inspect
方法不用于显示非列属性。因此,即使内存中有towername,它也只会显示公寓模型的列属性。**有关inspect的详细信息我还建议您尝试以下操作:
上面的语句将获取数组中的所有数据。结果与select相同,但select不会加载数组中的所有数据。
vsikbqxv2#
您应该使用
即单个字符串中的所有列名。
请参阅此。
5anewei63#
您可以尝试以下别名
au9on6nz4#
你可以试试这个
公寓.joins(:towers).select('apartments.id作为标识,apartments.name作为公寓名称,towers.id作为塔楼标识,towers.name作为塔楼名称)
您将得到如下响应#ActiveRecord::Relation [#〈Apt id:126,公寓名称:“地中海”,塔标识:12、铁塔_名称:“A塔”〉,#〈公寓标识:126,公寓名称:“地中海”,塔标识:15、铁塔_名称:“F座”〉]〉
pw9qyyiw5#
Rails 7adds支持此类查询,现在
select
接受哈希您可以使用如下别名
它产生这样的查询