Rails可以在has_many中建立动态关系吗?

时间:2015-12-08 09:30:49

标签: ruby-on-rails associations

我有一个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块停止工作。

有什么想法吗?

1 个答案:

答案 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)

注意:您不能将其视为关联,因此无法自行预加载。