我有一个Lesson模型,它有许多这样的完成:
class Completion < ActiveRecord::Base
belongs_to :user
belongs_to :completable, polymorphic: true
end
每个完成也属于用户:
has_one :completion do
def from_user current_user
Completion.where(completable: self, user: current_user)
end
end
从我的应用程序的角度来看,我只对某一课的完成量感兴趣,所以我已经包含了一个计数器缓存。关于单个完成,我只对当前用户完成课程感兴趣(我正在使用Devise)。
是否有某种方法可以创建某种动态的has_one关系,它使用current_user中的信息来查询Completion表?
例如:
foreign_key:
虽然这可行,但我也有多态关系。 Rails抱怨说没有名为lesson_id的外键。当我添加{{1}}符号时,do-end块停止工作。
有什么想法吗?
答案 0 :(得分: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)
注意:您不能将其视为关联,因此无法自行预加载。