2015-12-08 1 views
1

У меня есть модель урока, который имеет много доработок, как это:Может ли Rails иметь динамические отношения в has_many?

class Lesson < ActiveRecord::Base 
    has_many :completions, as: :completable 
    belongs_to :course 
end 

И каждый Завершение принадлежит пользователю, а также:

class Completion < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :completable, polymorphic: true 
end 

С моей точки зрения приложения Я заинтересован только в количестве, завершений для определенного урока, поэтому я включил счетчик кеша. Что касается индивидуальных завершений, меня интересует только то, что Урок завершен текущим пользователем (я использую Devise).

Есть ли способ создать динамическое отношение has_one какого-то типа, которое использует информацию из current_user для запроса таблицы завершения?

, например:

has_one :completion do 
    def from_user current_user 
    Completion.where(completable: self, user: current_user) 
    end 
end 

Хотя это может работать, я также имеющий полиморфное отношение. Rails жалуется, что нет внешнего ключа, называемого lesson_id. Когда я добавляю символ foreign_key:, блок do-end перестает работать.

Любые идеи?

+0

Почему вы не делаете область в Завершение, как 'scope user_complition, -> (урок, пользователь) {где (completeable: lesson, user: user)}' –

+0

И что бы я сделал с этой областью? Могу ли я использовать его как часть has_one? –

+0

нет, но он может выполнить ваше требование, когда вам нужно завершить урок пользователя, просто назовите 'Complition.user_lesson_completion (урок, пользователь) .first' –

ответ

0

Почему бы не пройти оба блока и варианты до has_many?

class Lesson < ActiveRecord::Base 
    has_many :completions, as: :completable do 
    def from_user user 
     if loaded? 
     find {|c| c.user_id = user.id} 
     else 
     find(user_id: user.id) 
     end 
    end 
    end 
    belongs_to :course 
end 

@lesson = Lesson.last 
# Association not loaded - executing sql query 
@lesson.completions.from_user(current_user) 
@lesson.completions 
# Association loaded - no sql query 
@lesson.completions.from_user(current_user) 

ПРИМЕЧАНИЕ: Вы не можете относиться к нему как к ассоциации, поэтому его нельзя предварительно загружать самостоятельно.

+0

Возможно ли это? Я думал, что дополнительный параметр в has_many вызывает у меня проблемы. Спасибо, я собираюсь попробовать это! Это именно то, что я искал! –

Смежные вопросы