这是我的简化模型,我加入了模型,
样板房
has_many :towers
和
模型塔
belong_to :apartment
然后我尝试在 Controller 中加入两个表也在 Rails 控制台中尝试过,如下所示:
Apartment.joins(:towers).select('apartments.id', 'apartments.name', 'towers.id' , 'towers.name')
问题是上面的查询只返回
apartments.id and apartments.name
也尝试使用这样的别名,仍然没有运气
Apartment.joins(:towers).select('apartments.id', 'apartments.name', 'towers.id as towerid' , 'towers.name as towername')
我已确认所有塔楼都有公寓,我知道我可以这样做以获得 1 个记录
Apartment.joins(:towers).select('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">
等等...
最佳答案
我认为这是可能的唯一方法是使用 as
q = Apartment.joins(:towers).select('apartments.id, apartments.name, towers.id as t_id, towers.name as t_name')
q.first.t_id
q.first.t_name
为什么 first.towers.id 不起作用?
apartment.towers
将返回 ActiveRecord::Associations::CollectionProxy
.您可以将其视为塔的集合。在 SQL 查询中,您指的是 towers
table 。但是,当您运行 apartment.towers.id 时,您是在 CollectionProxy 对象上调用 id ,这将不起作用。您可以使用 towers.first
获得第一个塔.关于,
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">]>
您在控制台中看到的是
inspsect
返回的结果方法。 inspect
方法并非旨在显示非列属性。因此,即使您在内存中有塔名,它也只会显示属于公寓模型列的属性。 更多关于inspect
我还建议尝试以下操作:
Apartment.joins(:towers).pluck('apartments.id, apartments.name, towers.id as t_id, towers.name as t_name')
以上语句将获取数组中的所有数据。与 select 获得的结果相同,但 select 不会加载数组中的所有数据。
关于ruby-on-rails - 如何从连接表中正确选择字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40036393/