我有一个关联,其中一个project has_many steps
,并且我想为step
找到一个“当前” project
。 project
表存储一个current_step
值,它是当前step.name
的{{1}}。
step
我正在尝试将其设置为ActiveRecord关联,因此我可以优化通过class Project < ApplicationRecord
# attributes: step_name:string
has_many :steps
has_one :current_step, -> { where("steps.name = projects.step_name") }, class_name: "Step"
end
class Step < ApplicationRecord
# attributes: project_id:integer, name:string
belongs_to :project
end
加载current_step
并避免出现project
问题。
但是,我不断收到错误消息:
n+1
我进行了一些观察,发现其他人遇到了这个TinyTds错误,但是我不确定是什么意思,或者它与我的特定情况有何关系。
如何选择ActiveRecord::StatementInvalid: TinyTds::Error: The multi-part identifier "projects.step_name" could not be bound.
,以便可以有效地包含它来避免current_step
?
答案 0 :(得分:1)
您实际上没有has_one
关联,但是您有has_many
的特殊成员,所以我用这种方式表示。通过steps
关联的扩展方法,您可以做到这一点:
has_many :steps do
def current
project = proxy_association.owner
find_by(name: project.step_name)
end
end
ActiveRecord为关联设置的proxy_association
使您可以回溯到包含project
的{{1}}。扩展方法中的proxy_association.owner
的作用域是关联。
然后您可以说诸如此类的话
find_by
获得您对project.steps.current
的期望。