根据条件定义 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_boolean
到 true
,当我调用 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
我想根据 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_boolean
到 true
,当我调用 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