Rails范围与多态模型

时间:2014-11-22 20:47:08

标签: ruby-on-rails rails-activerecord

我从具有多态关系的模型的非常基本范围得到一些奇怪的结果。以下是关系的简要概述和细节。

模型/ financials.rb

class Financial < ActiveRecord::Base    
  belongs_to :financiable, :polymorphic => true
  #ltm is a boolean field in the model
  scope :ltm,  -> { where(ltm: true).last }

然后有一个基本的公司模型,有很多财务

模型/ firm.rb

class Firm < ActiveRecord::Base
  has_many :financials, :as => :financiable, dependent: :destroy

firm没有ltm财务(即没有ltm: true财务)时,我得到一个奇怪的结果。但是,当我打电话给firm.financials.ltm时,我得到了属于公司但没有ltm:true的财务的积极记录关系。但是,当我执行firm.financials.where(ltm: true).last时,我得到nil

公司没有ltm财务的结果摘要:

firm.financials.ltm #AR relation of financials that belong to the firm but are not ltm
firm.financials.where(ltm: true).last #nil

更让人感到奇怪的是,当一家公司确实拥有该公司的财务资产时,该范围就会按预期运作。

有没有人曾经遇到过这个问题或有任何想法?我的意思是简单的答案是不使用范围,但我想了解可能导致这种情况的原因。

---基于评论的更新--- 谢谢大家对此深思熟虑。

  1. D面你是对的。代码为firm.financials.ltm而非firm.financials.ltm.last。当我输入问题时,这是一个错字。我更新了上面的内容以反映以及下面的SQL查询。
  2. JiříPospíšil - 很棒的建议。我将在我的应用程序中更新,但在此处保留相同内容,以免造成混淆。
  3. Chumakoff。如果用户没有使用before_save调用输入true,我强制将ltm设置为false,所以我不认为这是它,但感谢您的想法。
  4. 所以这些来自firm没有任何financials和ltm = true的情况。如您所见,范围请求正在对属于公司的所有财务进行数据库的第二次查询。当它在初始查询中找不到时,为什么会这样做呢?

      

    firm.financials.ltm

         

    财务负荷(4.6ms)选择“财务”。*来自“财务”   在哪里“财务”。“financiable_id”= $ 1 AND   “财务”。“financiable_type”= $ 2 AND“财务”。“ltm”='t'   订购“财务”。“id”DESC LIMIT 1 [[“financiable_id”,11],   [“financiable_type”,“公司”]]   财务负荷(1.2ms)选择“财务”。*来自“财务”WHERE   “财务”。“financiable_id”= $ 1 AND“财务”。“financiable_type”   = $ 2 [[“financiable_id”,11],[“financiable_type”,“公司”]]

         

    firm.financials.where(ltm:true).last

         

    财务负荷(16.8ms)选择“财务”。*来自“财务”   在哪里“财务”。“financiable_id”= $ 1 AND   “财务”。“financiable_type”= $ 2 AND“财务”。“ltm”='t'   订购“财务”。“id”DESC LIMIT 1 [[“financiable_id”,11],   [“financiable_type”,“公司”]]

1 个答案:

答案 0 :(得分:0)

您的范围无法正常工作,您的范围中的.last获得一个结果而不是ActiveRecord关系,请移除.last,并且范围可以正常运行Financials ltm=true 1}}