在另一个模型控制器中使用的 Rails 3 虚拟属性

Posted

技术标签:

【中文标题】在另一个模型控制器中使用的 Rails 3 虚拟属性【英文标题】:Rails 3 virtual attributes used in another Models controller 【发布时间】:2012-03-21 20:47:21 【问题描述】:

尝试在另一个控制器中实现模型的虚拟属性的问题。 有办法吗?

这里是虚拟属性:

def montant
  self.facture_details.sum(:montant_detail)
end

def paiements
  self.facture_paiements.sum(:montant)
end

def facture_statut
  if self.paiements < self.montant
  then
    "Ouverte"
  else
    "Payée"
  end
end

在另一个控制器中我正在尝试做:

 @factures = Facture.find(:all, :conditions => :facture_statut => 'Ouverte')

执行此操作时出现错误:

SQLite3::SQLException: no such column: factures.facture_statut: SELECT "factures".* FROM "factures" WHERE "factures"."facture_statut" = 'Ouverte'

有人帮我解决这个问题吗?

谢谢

更新;这是完整的模型:

class Facture < ActiveRecord::Base
  has_many :facture_details, :dependent => :destroy
  has_many :facture_paiements
  accepts_nested_attributes_for :facture_details, :allow_destroy => true
  accepts_nested_attributes_for :facture_paiements
  attr_accessor :facture_statut
  attr_accessor :montant
  attr_accessor  :paiements
  def montant
    self.facture_details.sum(:montant_detail)
  end
  def paiements
    self.facture_paiements.sum(:montant)
  end
  def facture_statut
    if self.paiements < self.montant
      then
      "Ouverte"
    else
      "Payée"
    end
  end
end

【问题讨论】:

你有facture_statut在模型中声明为attr_accessible;例如`attr_accessible :facture_statut? 仍然得到:SQLite3::SQLException:没有这样的列:factures.facture_statut: SELECT "factures".* FROM "factures" WHERE "factures"."facture_statut" = 'Ouverte' 你能发布你的整个模型吗? 在这里。感谢您的帮助 【参考方案1】:

好的...根据this post,在深入研究之后,您似乎无法使用 find 方法做您想做的事情。塞尔吉奥通常知道他在说什么。然而,其他响应者之一本杰明和答案on this post 提供了一种不同的方法,应该可行;使用范围。

所以不是这样:

@factures = Facture.find(:all, :conditions => :facture_statut => 'Ouverte')

你需要给模型添加一个作用域,然后调用作用域:

class Facture < ActiveRecord::Base
  scope :facture_statut lambda |facture_statut| :facture_statut => facture_statut
  #rest of class
end

然后这样称呼它:

Fracture.facture_statut('Ouverte')

【讨论】:

谢谢斯科特。我已经尝试过您的解决方案,听起来很有希望并得到一个错误:Unknown key(s): facture_statut 关于这个问题有什么想法吗?

以上是关于在另一个模型控制器中使用的 Rails 3 虚拟属性的主要内容,如果未能解决你的问题,请参考以下文章

Rails:2单击一个提交按钮在两个数据库中插入记录(将一个控制器的记录保存在另一个控制器中)

Rails 3 - 在另一个帖子的SHOW视图中无法创建新帖子

Rails:需要帮助在另一个模型的视图中显示一个模型的表单

Rails 在控制器动作中形成,在另一个视图中呈现?

如何在另一个控制器的上下文中使用rails form partial而不将ID作为隐藏字段传递

Rails 3 - 验证虚拟属性导致异常