【问题标题】:The usage of includes method for Ruby on RailsRuby on Rails的includes方法的使用
【发布时间】:2020-12-21 08:39:32
【问题描述】:

我不明白{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 是结果集中的(嵌套)关系,因此您无需编写多个查询。 “主要”关系由media.to_sym 指定,即动态的。看看你的 Rails 控制台——它应该输出 SQL 查询,这可能有助于理解发生了什么。 (取决于您的数据库架构)
  • 你读过the documentation吗?另外,these docs 也不错。网上也有很多深入的blog posts,以及相关的questions on StackOverflow
  • 关于你的后一个问题:它是有效的语法(我认为?......尝试运行它来看看!),但那个具体的例子是没有意义的——因为你只包括一个已经包含的关系.

标签: ruby-on-rails ruby syntax include


【解决方案1】:

这里发生的事情是,他们只是在作为参数提供给#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,因此还不清楚这段代码应该完成什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    相关资源
    最近更新 更多