【问题标题】:Rails 4: Is it possible to remove the call to a nested model?Rails 4:是否可以删除对嵌套模型的调用?
【发布时间】:2014-09-05 15:53:44
【问题描述】:

假设我有两个类,如下所示:

# has attribute name
class Foo
    accepts_nested_attributes_for :bar
end

# has attribute bing
class Bar

end

是否有可能在 Rails 中以某种方式轻松消除调用属于嵌套类的属性的需要(在本例中为 Bar)。也就是可以做到以下几点吗?

my_foo.name
my_foo.bing

我需要为Foo 中的每个Bar 属性创建实例方法吗?

此外,是否可以创建以这种方式设置的新关系,而无需传入显式参数哈希?

my_foo = Foo.new(name: "my_foo_name", bing: "my_foo.bar.bing")

提前感谢您对此的任何帮助

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 model attributes nested-attributes


    【解决方案1】:

    您应该可以使用delegate 方法来做到这一点。

    对于已定义的关联bar,将getter name 属性委托给bar

    class Foo < ActiveRecord::Base
      has_one :bar
      delegate :name, to: :bar
    end
    

    至于您的第二个问题,是的,您可以将设置器name=bing= 委托给bar,如上所示。您必须确保在分配完成之前创建关联的对象,否则您会收到“未定义的方法 ... for NilClass”错误。

    请参阅参考delegate documentation了解更多详情。

    【讨论】:

    • 谢谢,这正是我要找的,我不能给你足够的投票!我想补充一点,我在我的模型中使用 [slightly less known] after_initialize 回调来确保我的关联对象可用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    相关资源
    最近更新 更多