Rails:在ActiveRecord关注中使用不同的模型字段

时间:2014-02-15 03:42:16

标签: ruby-on-rails activerecord ruby-on-rails-4

Rails相当新,遇到了一个我似乎无法弄清楚的问题。

我有2个型号,User&帖子。用户将具有“名称”属性,帖子将具有“标题”属性。

在这两种情况下,我还想维护一个slug,它将在before_save上将相应的列转换为“sluggified”版本并将其存储为slug。我已经掌握了我想要的逻辑并且已经有了这个工作,但是,我想把这个行为抽象为一个关注点。

我似乎无法找到一种方法来设置它 - 主要是因为源字段的动态特性。我希望能够做到以下几点:

class User < ActiveRecord::Base
  include Sluggable

  act_as_slug :name
end

class Post < ActiveRecord::Base
  include Sluggable

  act_as_slug :title
end

不幸的是,无论我尝试过如何实施这个问题,我都遇到了问题。

虽然我想知道哪种类型的实现方式可行,但我也有兴趣听听这是否是一个关注的好用例?

1 个答案:

答案 0 :(得分:3)

这似乎有效,如果其他人正在寻找答案(肯定会向那些有更多经验的人提供更好的建议)。模型看起来像原始帖子中建议的那样。

module Sluggable
  extend ActiveSupport::Concern

  included do
    before_save :generate_slug
    class_attribute :sluggable_attribute

    def generate_slug
      self.sluggify(self.class.sluggable_attribute)
    end

    def sluggify(attribute)
      # Sluggify logic goes here
    end
  end

  module ClassMethods
    def acts_as_slug(value)
      self.sluggable_attribute = value
    end
  end
end