在我的运动应用中,用户可以检查"完成它的练习。如果我知道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
答案 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)。