Rails,ActiveRecord:has_one列名称匹配

时间:2019-06-11 16:47:08

标签: ruby-on-rails rails-activerecord tiny-tds

我有一个关联,其中一个project has_many steps,并且我想为step找到一个“当前” projectproject表存储一个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

1 个答案:

答案 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 的期望。