如何在Rails中正确使用基本作用域

时间:2018-05-29 04:39:24

标签: ruby-on-rails ruby

我有两个分享行为的模型。 [HttpPost] public ActionResult ActionForAjaxForm(FormModel model) { // do something like save the posted model return PartialView("_YourPartialView", model); } Post都可以有反应。

Comment

当我装饰它们时,我最终得到了许多完全相同的方法。

# ./app/models/post.rb
class Post < ApplicationRecord
  has_many :reactions, as: :reactionable
end

# ./app/models/comment.rb
class Comment < ApplicationRecord
  has_many :reactions, as: :reactionable
end

我希望它看起来像这样,但不知道放置文件的位置,以及我应该使用哪种技术(# ./app/decorators/post_decorator.rb class PostDecorator < ApplicationDecorator delegate_all def reactions_total_count object.reactions.count end def reactions_type(kind) object.reactions.collect(&:reaction_type).inject(0) {|counter, item| counter += item == kind ? 1 : 0} end def likes_count reactions_type('like') end def hearts_count reactions_type('heart') end def wows_count reactions_type('wow') end def laughs_count reactions_type('laugh') end def sads_count reactions_type('sad') end end # ./app/decorators/comment.rb class CommentDecorator < ApplicationDecorator delegate_all def reactions_total_count object.reactions.count end def reactions_type(kind) object.reactions.collect(&:reaction_type).inject(0) {|counter, item| counter += item == kind ? 1 : 0} end def likes_count reactions_type('like') end def hearts_count reactions_type('heart') end def wows_count reactions_type('wow') end def laughs_count reactions_type('laugh') end def sads_count reactions_type('sad') end end include)。

extend

请指教。我知道有一种更好的方法,我似乎无法做对。

2 个答案:

答案 0 :(得分:1)

首先,我会为包含的模块找出更好的名称。它可以被视为角色,您可以使用它来丰富类。此角色将声明一组*_count方法,这些方法在reactions中计算smth。 所以我将它命名为ReactionsCountable并另外将其放入命名空间以区别于装饰器:Roles::ReactionsCountable

然后我会把它放进去:

/app/decorators
  /roles
    /reactions_countable.rb
  /comment.rb
  /post.rb

其他的方法是使用经典的遗产。这里的Base名称有意义IMO:

class BaseDecorator < ApplicationDecorator
  # declare `*_count` methods here

class PostDecorator < BaseDecorator
class CommentDecorator < BaseDecorator

答案 1 :(得分:0)

我在Maicher的回答中找到了答案。

如果CommentDecorator位于./app/decorators/comment_decorator.rb内,并且我们想要包含一个模块ReactionablesCountable,那么我们需要在./app/decorators/roles/reactions_countable.rb内创建一个具有模块的文件嵌套,它反映了文件的路径。例如,include中的第一个常量,(Roles)指向文件夹Rails将查找它,第二个(ReactionsCountable)是文件的名称。

模块也需要嵌套在此文件中。我已经在下面展示了它。

module Roles
  module ReactionsCountable
    # methods defined here.
  end
end