Ruby on rails 如何在没有原始SQL的多态关联中查询上游?

Ruby on rails 如何在没有原始SQL的多态关联中查询上游?,ruby-on-rails,activerecord,polymorphic-associations,Ruby On Rails,Activerecord,Polymorphic Associations,在我的练习应用程序中,用户可以“检查”一个练习来完成它。如果我知道可检查_类型为“Exercise”,并且具有可检查_id,我如何查询练习名称 我不知道该在控制器中放入什么,以便根据可检查的类型和id列出“已完成的练习”及其名称 class Exercise < ActiveRecord::Base attr_accessible :name has_many :checks, :as => :checkable end class Check < Acti

在我的练习应用程序中,用户可以“检查”一个练习来完成它。如果我知道可检查_类型为“Exercise”,并且具有可检查_id,我如何查询练习名称

我不知道该在控制器中放入什么,以便根据可检查的类型和id列出“已完成的练习”及其名称

class Exercise < ActiveRecord::Base
    attr_accessible :name 
    has_many :checks, :as => :checkable
end

class Check < ActiveRecord::Base
    belongs_to :checkable, :polymorphic => true
    attr_accessible :checkable, :checkable_id, :checkable_type
end
课堂练习:可检查
结束
类检查true
属性可访问:可检查,:可检查\u id,:可检查\u类型
结束

加入另一个型号会满足您的需求吗

completed_exercises = Exercise.joins(:checks)

这应该会产生一个内部联接,AR已经知道如何将多态关联作为查询的一部分包含进去。

您可以定义一个作用域
可检查类型

scope :checkable_type, lambda { |class_name| where("checkable_type = ?", class_name) }
我猜您需要类型为
'Exercise'
的多态记录,并且只有在练习完成时才会创建,或者您可以在
completed\u的
timestamp列中维护它

然后,您可以提取所有已完成练习的列表

scope :completed, where('completed_at IS NOT NULL')

completed_exercises = Check.checkable_type('Exercise').completed
如果不是这样的话,您可以忽略
已完成的
范围

解决了它

class Exercise < ActiveRecord::Base
  attr_accessible :exercise_name
  has_many :checks, as: :checkable
end

class Check < ActiveRecord::Base
  belongs_to :checkable, polymorphic: true
  attr_accessible :checkable_id, :checkable_type, :exercise_name
end
课堂练习
我意识到在调用练习模型中所需的属性之前,我需要调用.checkable

<% @checks.each do |check| %>
  <%= check.checkable.exercise_name %>
  <%= check.checkable.created_at %>
<% end %>


这会从练习表中提取正确的练习名称和“完成时间”(通过创建时间)。

不完全-这会提取所有已完成练习的列表,但不会显示您何时完成以及是否多次完成。我怎样才能做像完成的练习=检查连接(:练习)这样的事情?这样我就可以在每次有人完成时提取练习的名称并创建_?在这种情况下,我会将其翻转过来,然后从检查开始。类似于swap.nil的答案。只需确保包含练习关联,以便在遍历check.exercise时不会触发N+1查询。