【问题标题】:ROR- Cannot use Find in a 1-many relationshipROR - 不能在一对多关系中使用 Find
【发布时间】:2009-05-25 06:16:22
【问题描述】:

在 Ruby on rails 中,我们的模型包括订单和付款。 订单和付款之间存在一对多的关系。 在订单模型中,我们指定: has_many :payments, :as => :payable 并且付款记录的payable_id 设置为order.id。

在报告中,我想选择属于给定类型订单的所有付款。 使用: payments = Payment.find(:all, :conditions => conditions) 并且在条件中添加 'payable.type="a" ' 不起作用。 ActiveRecord 似乎没有将其发展为正确的连接语句(payable_id=order.id 和 orders.type='a')。 我不能在这里使用显式 SQL,因为条件包含在代码前面插入的其他内容。 谢谢, 拉菲利普金

【问题讨论】:

    标签: ruby activerecord


    【解决方案1】:

    您的条件子句是错误的。

    您声明Order

    has_many :payments, :as => :payable
    

    这告诉我Payment

    belongs_to :payable, :polymorphic => true
    

    这意味着payments 表有两列需要注意:payable_idpayable_type。这也意味着Payments不仅可以应用于Orders,还可以应用于其他模型(CreditCardBalances,谁知道)。

    如果您想查询特定类型的付款,即属于特定类的任何实例,您需要查询字段payments.payable_type。这工作正常:

    Payment.find(:all, :conditions => "payable_type = 'Order'")
    

    Here's a gist 显示了我为测试它所做的工作。创建的模型的设置与上述相同。

    不要忘记,如果更简单,您可以将其提取到命名范围中:

    named_scope :on_orders, :conditions => "payable_type = 'Order'"
    

    这是什么原因

    Payment.on_orders
    

    或动态:

    named_scope :on, lambda { |type| { :conditions => "payable_type = '#{type.to_s}'" } }
    

    然后就成功了

    Payment.on(Order) # or Payment.on(CreditCardBalance) or Payment.on("Order")
    

    【讨论】:

    • 谢谢。你说的对。付款可以属于其他类型。我会尝试在条件中添加 payment.type。
    • 叹息。这不是“payment.type”。在数据库中查看它。它是“payments.payable_type”。
    【解决方案2】:

    尝试在条件中包含并引用实际的表id名称,而不是关联别名:

    find(:include => "payments", :conditions => ["payment.type = ?", "x"]
    

    【讨论】:

      【解决方案3】:

      您提到了“付款方式”。如果它们是相当静态的,您是否考虑过使用单表继承 (STI) 对不同的支付类型进行子类化?然后 Rails 会做所有的魔法来过滤类型。

      例如

      class CreditCardPayment < Payment
      ...
      end
      

      它甚至不需要一开始就表现出不同的行为;但是,您可能会发现,围绕付款拥有不同的数据和多态行为非常有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-09
        • 2016-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-07
        相关资源
        最近更新 更多