Ruby on rails Rails-attr\u accessor:-读取属性值,而不是重写它的函数

Ruby on rails Rails-attr\u accessor:-读取属性值,而不是重写它的函数,ruby-on-rails,activerecord,ruby-on-rails-5,Ruby On Rails,Activerecord,Ruby On Rails 5,我有一个模型客户,它接受一个虚拟属性期初余额。代码如下所示: model Customer < ApplicationRecord attr_accessor :opening_balance has_one :ledger_account after_create :open_ledger_account def opening_balance ledger_account.opening_balance if ledger_account.present?

我有一个模型
客户
,它接受一个虚拟属性
期初余额
。代码如下所示:

model Customer < ApplicationRecord
  attr_accessor :opening_balance

  has_one :ledger_account

  after_create :open_ledger_account

  def opening_balance
    ledger_account.opening_balance if ledger_account.present?
  end

  private

  def open_ledger_account
    create_ledger_account!(opening_balance: self.opening_balance)
  end
但这也不起作用

如何读取存储在实际属性中的值?任何帮助都将不胜感激。我使用的是rails 5.1


谢谢

attr\u accessor
定义实例变量和访问它的方法(读/写)

因此,简单的方法是写:

def open_ledger_account
  create_ledger_account!(opening_balance: @opening_balance)
end

只有当
期初余额
客户
上数据库中的一个属性时,
读取属性
才有效

attr\u accessor
定义实例变量和访问它的方法(读/写)

因此,简单的方法是写:

def open_ledger_account
  create_ledger_account!(opening_balance: @opening_balance)
end

只有当
期初余额
客户
上数据库中的一个属性时,
读取属性
才有效

首先,您必须了解
attr\u accessor
不定义实例变量。它只创建setter和getter方法。
attr\u accessor:name
所做的是:

class Person
  def name
    @name
  end

  def name=(value)
    @name = value
  end
end
现在,您可以从外部访问实例变量:

p = Person.new
p.name = 'Jane'
puts p.name
您还可以使用getter方法而不是
@name
,从内部访问实例变量:

class Person
  attr_accessor :name
  def hello
    "hello my name is: #{name}"
  end
end

attr\u访问器
不“定义”实例变量。Ruby中没有像Java这样的成员/属性声明。实例变量在第一次设置时声明。访问尚未赋值的实例变量将返回nil

那么这里发生了什么:

class Customer < ApplicationRecord
  attr_accessor :opening_balance
  # ...
  def opening_balance
    ledger_account.opening_balance if ledger_account.present?
  end
end

首先,您必须了解
attr\u accessor
不定义实例变量。它只创建setter和getter方法。
attr\u accessor:name
所做的是:

class Person
  def name
    @name
  end

  def name=(value)
    @name = value
  end
end
现在,您可以从外部访问实例变量:

p = Person.new
p.name = 'Jane'
puts p.name
您还可以使用getter方法而不是
@name
,从内部访问实例变量:

class Person
  attr_accessor :name
  def hello
    "hello my name is: #{name}"
  end
end

attr\u访问器
不“定义”实例变量。Ruby中没有像Java这样的成员/属性声明。实例变量在第一次设置时声明。访问尚未赋值的实例变量将返回nil

那么这里发生了什么:

class Customer < ApplicationRecord
  attr_accessor :opening_balance
  # ...
  def opening_balance
    ledger_account.opening_balance if ledger_account.present?
  end
end

期初余额
属性在保存之前可用。保存customer对象后,在回调中,它只获取与新创建的customer对象关联的属性。我建议您使用嵌套表单,在自定义模型中,您可以将
期初余额
作为嵌套属性获取。
期初余额
属性在保存之前可用。保存customer对象后,在回调中,它只获取与新创建的customer对象关联的属性。我建议您使用嵌套表单,在自定义模型中,您可以将
期初余额
作为嵌套属性。
属性访问器
不定义实例变量。它只是创建一个setter和getter方法。当您第一次为实例变量赋值时,它们都是“已定义”的。因此调用setter方法将“定义”变量。显然是这样,因为在ruby中,没有其他方法“定义”实例变量,然后通过赋值。我的描述有意地简明扼要,以使答案简明扼要。
attribute\u accessor
没有定义实例变量。它只是创建一个setter和getter方法。当您第一次为实例变量赋值时,它们都是“已定义”的。因此调用setter方法将“定义”变量。显然是这样,因为在ruby中,没有其他方法“定义”实例变量,然后通过赋值。我的描述有意地简明扼要,以使答案简明扼要。我喜欢代表们的建议。我的猜测是,
attr_accessor
之所以存在,是因为在创建新客户时,可以立即以相同的形式输入期初余额。不幸的是,使用代理将破坏该解决方案;但我认为这最终会导致一个更干净的解决方案,例如,让控制者来处理1)新客户的创建,2)分类账账户,而不是让模型来处理。我喜欢代表们的建议。我的猜测是,
attr_accessor
之所以存在,是因为在创建新客户时,可以立即以相同的形式输入期初余额。不幸的是,使用代理将破坏该解决方案;但这最终会导致一个更干净的解决方案,例如,让控制者处理1)新客户的创建,2)分类账账户,而不是让模型处理。