根据条件定义 getter 的 return

Define the return of a getter depending on a condition

我想根据 Rails 上 Ruby 中的条件更改 getter 方法 returns 5.

我有:

class Foo < ApplicationRecord
  # has an boolean attribute :my_boolean
  has_many :bars, through: :FooBar, dependent: :destroy
end

class Bar < ApplicationRecord
  has_many :foos, through: :FooBar, dependent: :destroy
  scope :my_scope, -> {where(some_attribute: true)}
end

class FooBar < ApplicationRecord
  belongs_to :Foo
  belongs_to :Bar
end

我希望如果 Foo 有 :my_booleantrue,当我调用 foo.bars 它时 returns 他的柱在范围 :my_scope 内,否则它 returns 他所有的酒吧。

我试图覆盖 Bar getter 但没有成功,例如:

class Foo < ApplicationRecord
  ...

  def bars
    bars = self.bars
    return bars.my_scope if self.my_boolean
    bars
  end
end

请问有什么想法可以实现吗?

如果没有 stack level too deep 异常,你不能以相同的方式命名你的 has_many 和你的方法(我想你在代码中打错了,它应该是 has_many :bars,带“s”)。

你可以做的是:

def my_boolean_bars
  return bars unless my_boolean

  bars.my_scope
end

或者用你实现的方法,我觉得没问题。

编辑:

如果你想保留方法名,你可以这样做:

class Foo < ApplicationRecord
  has_many :bars, through: :FooBar, dependent: :destroy

  alias_method :ori_bars, :bars

  def bars
    return ori_bars unless my_boolean
    
    ori_bars.my_scope
  end
end