Ruby on rails 具有多个关联的Rails委托方法

Ruby on rails 具有多个关联的Rails委托方法,ruby-on-rails,ruby,rails-activerecord,Ruby On Rails,Ruby,Rails Activerecord,delegate方法似乎是在rails应用程序中到处执行零检查的一个很好的替代方法,但我很难将其应用于我有多个关联的情况 以这些关联为例: #app/models/user.rb class User < ActiveRecord::Base belongs_to :blog end #app/models/blog.rb class Blog < ActiveRecord::Base belongs_to :hash_tag has_one :user end #a

delegate
方法似乎是在rails应用程序中到处执行零检查的一个很好的替代方法,但我很难将其应用于我有多个关联的情况

以这些关联为例:

#app/models/user.rb
class User < ActiveRecord::Base
  belongs_to :blog
end

#app/models/blog.rb
class Blog < ActiveRecord::Base
  belongs_to :hash_tag
  has_one :user
end

#app/models/hash_tag.rb
class HashTag < ActiveRecord::Base
  has_one :blog
end
我想找到他的博客:

@user.blog
  => nil
它在这里返回nil,因为该
用户
碰巧没有关联的
博客
,因此如果我对该
用户
执行类似操作,则以下代码将破坏应用程序:

@user.blog.title
  => undefined method `title' for nil:NilClass
所以我可以这样做:

@user.blog.title if @user.blog.present?
@user = User.find(1)
@user.blog_title.hash_tag.tag_name
但这是一个零检查,我们希望避免零检查,因为否则它们将在应用程序中无处不在

所以你可以用得墨忒尔定律来做这件事,效果很好:

# open up app/models/user.rb
class User < ActiveRecord::Base
  belongs_to :blog
  delegate :title, to: :blog, prefix: true, allow_nil: true #add this
end
太好了,这很有效,我们避免了零支票。但是如果我们想要获取相关的
hash\u tag.tag\u name
,该怎么办?如果零不是一个问题,我们可以这样做:

@user.blog.title if @user.blog.present?
@user = User.find(1)
@user.blog_title.hash_tag.tag_name
这不仅会违反德米特定律,而且因为nil是一个问题,并且相关的hash_标记对象可能不存在,因此有一天我们会再次遇到错误:
未定义nil:NilClass的方法“title”

我试图再次打开
User
类并为代理添加嵌套目标,但它对我无效:

# again: open up app/models/user.rb
class User < ActiveRecord::Base
  belongs_to :blog
  delegate :title, to: :blog, prefix: true, allow_nil: true
  delegate :tag_name, to: :'blog.hash_tag', prefix: true, allow_nil: true #doesn't work
end
再次:打开app/models/user.rb 类用户
显然,我的语法是关闭的,因为它不喜欢我将这个嵌套目标指定为:
:'blog.hash_tag'

我想做的是能够说:
@user.blog\u hash\u tag\u tag\u name
。这可以通过委派来实现吗


我确实复习了这本书。我没有看到它像我目前的情况那样提到多个关联。

我建议您使用它,它在gem(查看它的文档,它运行得很好!)和他的ActiveRecord对应程序中得到了很好的实现
.

作为个人观点,
@user.blog\u hash\u tag\u tag\u name
看起来很可怕

也就是说,想要在用户级别定义两个委托也是违反LoD的,因为您使用的是用户类中关于blog内部工作的知识(它属于hash_标记)

如果要使用委托,应将其添加到类
User

delegate :hash_tag_tag_name, to: :blog, prefix: true, allow_nil: true
和班级
Blog

delegate :tag_name, to: :hash_tag, prefix: true, allow_nil: true

同意。这是一个可笑的方法名称。我只是不知道怎样才能做得更好。