Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何消除这段代码_Ruby On Rails_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 如何消除这段代码

Ruby 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

我已经为模型单元、组和事件实现了一个标记系统,目前,每个模型都有自己的方法实例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_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(或者插件),它基本上是这样工作的。但是看到解释比被告知使用宝石更好
编辑:以下是在标记端设置关联所需的代码:注意source选项

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