如何在没有原始SQL的情况下在多态关联中查询上游?

时间:2013-03-13 06:27:21

标签: ruby-on-rails activerecord polymorphic-associations

在我的运动应用中,用户可以检查"完成它的练习。如果我知道checkable_type是'练习'并拥有checkable_id,如何查询练习名称?

我不确定在我的控制器中放入一个"完成的练习列表"和他们的名字基于checkable_type和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

3 个答案:

答案 0 :(得分:0)

加入其他模型会不会给你你想要的东西?

completed_exercises = Exercise.joins(:checks)

这应该产生内部联接,并且AR已经知道如何将多态关联包括在查询中。

答案 1 :(得分:0)

您可以定义范围checkable_type

scope :checkable_type, lambda { |class_name| where("checkable_type = ?", class_name) }

我想你想要类型为'Exercise'的多态记录,并且只有在完成练习后才能创建,或者你可以在completed_at时间戳列中保留它。

然后你可以列出所有已完成的练习

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

completed_exercises = Check.checkable_type('Exercise').completed

如果情况并非如此,您可以忽略completed范围

答案 2 :(得分:0)

想出来了!

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 %>

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