0

在我的锻炼应用程序中,用户可以“检查”一个锻炼来完成它。如果我知道 checkable_type 是 'Exercise' 并且有 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
4

3 回答 3

0

只是加入另一个模型会给你你想要的吗?

completed_exercises = Exercise.joins(:checks)

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

于 2013-03-13T06:39:11.460 回答
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如果不是这种情况,您可以忽略范围

于 2013-03-13T08:30:04.777 回答
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)。

于 2013-03-13T22:36:35.680 回答