Ruby on rails 如何消除这段代码
我已经为模型单元、组和事件实现了一个标记系统,目前,每个模型都有自己的方法实例add_tags和self.tagged_withRuby on rails 如何消除这段代码,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我已经为模型单元、组和事件实现了一个标记系统,目前,每个模型都有自己的方法实例add_tags和self.tagged_with def add_tags(options=[]) transaction do options.each do |tag| self.tags << Tag.find_by(name: tag) end end end 我想将它们移动到一个模块中,并将它们包含在模型中,但正如您所看到的,tagged
def add_tags(options=[])
transaction do
options.each do |tag|
self.tags << Tag.find_by(name: tag)
end
end
end
我想将它们移动到一个模块中,并将它们包含在模型中,但正如您所看到的,tagged_with方法不是多态的,因为我不知道如何引用父类(Unit、Group等)并对其调用“all”等方法。有什么建议吗
标签型号:
Class Tag < ActiveRecord::Base
has_and_belongs_to_many: units, :join_table => :unit_taggings
has_and_belongs_to_many: groups, :join_table => :group_taggings
has_and_belongs_to_many: events, :join_table => :event_taggings
end
Class标记:单位\u标记
有且属于多个组,:join\u table=>:group\u标记
是否有和属于多个:事件,:join\u table=>:事件标记
结束
您可以调用self.class
获取当前类,如下所示:
def self.tagged_with(tags=[])
klass = self.class
units = klass.all
tags.each do |tag|
units = units & Tag.find_by_name(tag).units
end
units
end
end
self.class
应返回Unit
或调用类对象上任何方法的任何类(self.class.tagged\u with
)与Unit.tagged\u with
我建议您使用关注点
,看一看
编辑回答您的评论
使用关注点,您可以这样做,每个类都有您前面提到的方法,但您不必重写每个类(或文件)上的所有代码:
我想这样做:
#table: taggings, fields: tag_id, taggable type (string), taggable id
class Tagging
belongs_to :tag
belongs_to :taggable, :polymorphic => true
现在在lib中创建一个模块,我们称之为“ActsAsTaggable”*
现在,您可以在任何想要标记的类中执行此操作
include ActsAsTaggable
- 已经有一个名为ActsAsTaggable的gem(或者插件),它基本上是这样工作的。但是看到解释比被告知使用宝石更好
class Tag
has_many :taggings
has_many :taggables, :through => :taggings, :source => :taggable
使用关注点和模块之间有什么区别?哪一个最适合这种类型的东西?好的,谢谢你的回答,但是我如何让“单位”调用“标记。按名称查找(标记)。单位”多态,因为它是一种关联?你能发布你的
标记模型吗?看看@Max\u Williams answer,他在其中谈到任务模型,我认为这应该是一个很好的解决方案,但我建议使用关注点
而不是模块,因为它们已经在类方法上进行了验证,并且包括了,除了那个伟大的解决方案之外。是的,我还没有进入关注点,我们在这里仍然有点复古:)源代码做什么?:源代码是什么“调用联接对象以获取联接远端的对象的方法“。通常rails可以猜出这是什么,但是对于这样的多态关联,您需要告诉它。注意:多年来,rails在多态关联方面做了很多改变,从对多态关联保持沉默开始,变得越来越聪明,越来越受惯例的驱使。因此,这在您的版本中可能不起作用。但是如果没有,你应该可以用谷歌搜索它。多态方法中我缺少的一件事是,我不再能够调用sometag.units、sometag.events来获取与该标记关联的所有记录,有没有办法解决这个问题?
module ActsAsTaggable
def self.included(base)
base.extend(ClassMethods)
base.class_eval do
#common associations, callbacks, validations etc go here
has_many :taggings, :as => :taggable, :dependent => :destroy
has_many :tags, :through => :taggings
end
end
#instance methods can be defined in the normal way
#class methods go in here
module ClassMethods
end
end
include ActsAsTaggable
class Tag
has_many :taggings
has_many :taggables, :through => :taggings, :source => :taggable