Ruby on Rails的include方法的用法

问题描述

我不明白{article: :categories}对以下代码的含义。 我已经阅读了文档,但是没有显示类似includes(z => {x: :y})的示例。有人可以用其他我可以理解的形式吗? x: :y到底是什么?

@articles = ArticleBase.includes(media.to_sym => { article: :categories })

此外,如果我要向其添加其他条件(.includes(media.to_sym => :article)),下面的代码在语法上是否正确?

@articles = ArticleBase.includes(media.to_sym => { article: :categories },media.to_sym => :article)

解决方法

这里发生的是,它们只是在作为#includes的参数提供的哈希中动态分配哈希键:

"foo".then do |media|
  { media.to_sym => { article: :categories }}
end
=> {:foo=>{:article=>:categories}}

当您使用哈希火箭哈希语法而不是冒号语法时,这是可能的。

{ media.to_sym: bar } # Raises a SyntaxError

下面的代码在语法上是否正确?

@articles = ArticleBase.includes(media.to_sym => { article: :categories },media.to_sym => :article)

不是。它不会引发语法错误,但也不会满足您的预期。当您的哈希字面量包含重复的键时,Ruby不会警告您-它只会用键的最后给定值覆盖。

"foo".then do |media|
  { media.to_sym => { article: :categories },media.to_sym => :acticle }
end
# => {:foo=>:acticle}

由于{ article: :categories }将包含article,因此还不清楚该代码应该完成什么操作。