【问题标题】:How to invoke a child models scope from parent in ActiveRecord?如何从 ActiveRecord 中的父级调用子模型范围?
【发布时间】:2017-04-18 02:48:56
【问题描述】:

请帮助我找到在父范围内调用子范围的方法。有什么办法可以做到这一点。

场景如下:

class Film < ActiveRecord::Base
  ...
  has_many :shows
  scope :active_shows, ->{
    joins(:shows)
  }
  ...
end

class Show < ActiveRecord::Base
  ...
  belongs_to :film
  scope :active_for_now, ->{
   ...
  }
  ...
end

从上面的例子,我想知道如何从active_shows 调用范围active_for_nowshow 表有字段start_timeend_time,当我调用Film.active_shows 时,必须获取当前时间所有正在放映的电影。

如果有任何解决方案,请帮助我,如果我出错了,请更正。

【问题讨论】:

  • 您好,您能描述一下您要解决的问题吗?
  • @Bohdan 我用更好的例子更新了问题,我想请通过它。
  • 它不应该是一个范围。声明另一个has_many 关联。

标签: ruby-on-rails activerecord scope


【解决方案1】:

我对范围和关联名称以及它们是否代表我没有看到的关系感到有些困惑,但要调用在 has_many 上定义的范围,您可以使用 #merge

class A < ActiveRecord::Base
  ...
  has_many :bs
  scope :abs, ->{
    joins(:bs).merge(B.bas)
  }
  ...
end

【讨论】:

    【解决方案2】:

    您可以设置一个单独的has_many association with a scope:

    class Film < ActiveRecord::Base
      has_many :shows
      has_many :active_shows, class_name: 'Show', ->{ Show.active_for_now }
    end
    

    主要优点是加入时可以直接使用关联:

    @films = Film.eager_load(:active_shows).find(params[:id])
    

    【讨论】:

    • 不过我会称之为currently_active
    • 感谢您的建议,但恐怕这不适用于我的情况。 has_many 关联让我们可以完成一对多的关系权。我正在寻找的是例如:通过使用范围 Show.active_for_now 我将获得所有当前活动的节目我希望实现的是当我调用范围 Film.active_shows 我想获得所有电影目前处于活动状态。
    • 这是一个非常令人困惑的名字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多