ruby-on-rails - 如何从连接表中正确选择字段?

标签 ruby-on-rails ruby-on-rails-4 activerecord rails-activerecord

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

样板房

   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/

相关文章:

ruby-on-rails - 部分未显示在 View 中

ruby-on-rails - 确保在保存并创建主模型后创建或保存关联 Rails 4

ruby-on-rails - 在 form_tag 中加载数据而不刷新 Rails 4 中的页面

ruby-on-rails - Rails 4 中的 null_session 和 reset_session 有什么区别?

ruby-on-rails - 截断字符串而不在 Rails 中的单词中间进行切割

ruby-on-rails - 初学者 Rails 增删改查

ruby - 通过 Rails 控制台获取模型名称会给出不同的结果

mysql - 事件记录,其中 {}

ruby - Rails 关联 - 同一个类的多个 has_one 关系

ruby-on-rails - capistrano + sidekiq/无法选择环境变量