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

理解した!

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 に答える
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

他のモデルに参加するだけで、あなたが望むものを手に入れることができますか?

completed_exercises = Exercise.joins(:checks)

これにより内部結合が生成され、AR はクエリの一部としてポリモーフィック アソシエーションを含める方法を既に認識しています。

于 2013-03-13T06:39:11.460 に答える