3

我一直在使用 CodeClimate 来改进我的代码库,并且我有一个模型类,对于那些不使用 CodeClimate 的模型类来说,它落在“方法之外的定义”和“总体复杂性”上,方法之外的定义是指类关联和验证等定义。总的整体复杂性就是它所说的,即我的个人方法都不是太复杂,以至于整个类都太复杂了。

现在我明白这可能是一个错误的立场,但我的分数上的 D 类很烦人,我很可能可以做更多的事情来改进这门课,所以我的问题是:

如果我应该做些什么来简化这个 ActiveRecord 类呢?

我的主要问题是我已经用尽了所有关于重构胖模型的方法,使用这篇文章http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat- activerecord-models/和类似的,我基本上只剩下:

  • 范围 x2
  • attr_accessible x2
  • 载波支架 x1
  • 验证器 x4
  • 协会 x16
  • Accept_nested_attributes_for x1
  • 钩子,例如 after_save x3
  • 对各种其他属性进行一些计算的方法,以使我的视图更具语义化且更易于理解
  • 围绕关联的方法,处理空关联,合并关联

它是一个闭源项目,但鉴于此类中缺乏领域逻辑,我在这里分享了它。https://gist.github.com/msaspence/5317419

4

1 回答 1

3

回调是地狱。我的意思是,它们很有用,但它们很快就会使您的模型超载。

你的控制器中有一个动作来处理取消发布的事情吗?

如果是这样(我希望如此),可以将其移动/提取到服务对象:

after_save :email_author_if_first_published
def email_author_if_first_published
  if pending_was == true && pending == false
  self.create_activity key: 'action.publish'
  delay.send_action_published_email
end
end

def send_action_published_email
  ActionAuthorMailer.action_published(self, self.user).deliver
end

这不应该属于模型,一些演示者应该更好:

def mixpanel_data_points
  {
    campaign_id: campaign_id,
    cause_id: cause_id
  }
end

def open_graph_type
  'campaign_action'
end

def facebook_invite_message
  "Please help me raise awareness on PatientsCreate. It'll take you 5 seconds and could create genuine change. Thanks"
end

def percentage_completed
  v = (participation_count.to_f/participation_target_count.to_f)*100
  v > 100.0 ? 100.0 : v
end

这似乎不太好:

after_update :update_campaing_actions_count
def update_campaing_actions_count
  Campaign.decrement_counter(:actions_count, self.campaign_id_was)
  Campaign.increment_counter(:actions_count, self.campaign_id)
end

因为即使没有更改campaign_id,您也会这样做


这看起来很糟糕:

def url
  open_graph_url "/actions/#{id}"
end

不能说更多,我真的不知道在其他方法中什么是纯粹的数据或表示

于 2013-04-05T08:17:55.830 回答