ruby-on-rails - 如何让Parent-Child-Parent作用域留在Parent内部?

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

我有爸爸、妈妈和 child 模型。我的妈妈有一个名为 is_online 的 bool 属性。现在我正在做这样的分页链:

def show
  @dad = Dad.find(params[:dad_id])
  @kids =  @dad.kids.online.paginate(:page => params[:page])
end

允许我查看仅在线的爸爸的 child 的列表。

我的模型是这样设置的:

class Kid < ActiveRecord::Base
  belongs_to :dad
  belongs_to :mom

  scope :online, joins(:mom).where("moms.is_online = ?", true)
end

class Dad < ActiveRecord::Base
  has_many :kids
end

class Mom < ActiveRecord::Base
  has_many :kids
end

我遇到的问题是这不会只返回这个爸爸的 child 和在线妈妈,而是返回所有爸爸的 child 。我怎样才能使范围正确?

编辑

SELECT DISTINCT "kids"."dad_id" FROM "kids"
 => [14, 25, 27, 8, 12, 17, 28, 1, 15, 10, 26, 11, 4, 18, 30, 16, 6, 19, 29, 2, 21, 3, 23, 31, 20, 5, 13, 22, 9, 7, 24]

Kid Load (1.5ms)  SELECT "kids".* FROM "kids" INNER JOIN "moms" ON "moms"."id" = "kids"."mom_id" WHERE (moms.is_online = 't')
 => #<ActiveRecord::Relation [
 #<Kid id: 7, dad_id: 1, mom_id: 5, created_at: "2014-04-28 16:10:48", updated_at: "2014-04-28 16:10:48">, 
 #<Kid id: 21, dad_id: 2, mom_id: 5, created_at: "2014-04-28 16:10:48", updated_at: "2014-04-28 16:10:48">, 
 #<Kid id: 35, dad_id: 3, mom_id: 5, created_at: "2014-04-28 16:10:48", updated_at: "2014-04-28 16:10:48">, 
 #<Kid id: 49, dad_id: 4, mom_id: 5, created_at: "2014-04-28 16:10:48", updated_at: "2014-04-28 16:10:48">, 
 #<Kid id: 63, dad_id: 5, mom_id: 5, created_at: "2014-04-28 16:10:48", updated_at: "2014-04-28 16:10:48">, 
 #<Kid id: 77, dad_id: 6, mom_id: 5, created_at: "2014-04-28 16:10:48", updated_at: "2014-04-28 16:10:48">, 
 #<Kid id: 91, dad_id: 7, mom_id: 5, created_at: "2014-04-28 16:10:48", updated_at: "2014-04-28 16:10:48">, 
 #<Kid id: 105, dad_id: 8, mom_id: 5, created_at: "2014-04-28 16:10:48", updated_at: "2014-04-28 16:10:48">, 
 #<Kid id: 119, dad_id: 9, mom_id: 5, created_at: "2014-04-28 16:10:48", updated_at: "2014-04-28 16:10:48">, 
 #<Kid id: 133, dad_id: 10, mom_id: 5, created_at: "2014-04-28 16:10:48", updated_at: "2014-04-28 16:10:48">, ...]> 

最佳答案

如下更改您的范围:

scope :online, -> { joins(:mom).where("moms.is_online = ?", true) }

不知何故,在 Rails 4 中,您的 online 范围没有链接到由 @dad.kids 形成的查询。以上是定义 Scope in Rails 4 的正确方法

关于ruby-on-rails - 如何让Parent-Child-Parent作用域留在Parent内部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23409756/

相关文章:

ruby-on-rails - 使用 Simplecov 使用现有 TestUnit 测试和覆盖率运行 RSpec

ruby - 悲伤的故事 - git+ssh+ruby

ruby-on-rails - 验证 habtm 关联的长度而不保存

ruby-on-rails - 找到 id = 1 的 Zombie 并将其存储在变量中

ruby-on-rails - 奇怪的 PG::UndefinedTable 错误与 Heroku 上的 Rails 应用程序

ruby-on-rails - 以线程安全的方式设置 Rails ActiveResource header

ruby-on-rails - Ruby - 编写一个基本的 Controller

ruby-on-rails - RSpec 未加载 ControllerMacros 方法

ruby-on-rails - 查找具有关系记录的记录失败:PG::UndefinedTable: ERROR: missing FROM-clause entry for table

activerecord - yii2 如何使用外键获取关系和获取 id 的标题