加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何在rails中扩展belongs_to功能

发布时间:2020-12-17 03:05:45 所属栏目:百科 来源:网络整理
导读:我正在构建一个gem,我想要它的一部分功能来扩展ActiveRecord :: Associations :: Builder :: BelongsTo但我无法弄清楚如何去做 所以基本上用户应该能够指定: class Event ActiveRecord::Base belongs_to :users,foo: trueend 有谁知道怎么做? 这不会工作:
我正在构建一个gem,我想要它的一部分功能来扩展ActiveRecord :: Associations :: Builder :: BelongsTo但我无法弄清楚如何去做

所以基本上用户应该能够指定:

class Event < ActiveRecord::Base
  belongs_to :users,foo: true
end

有谁知道怎么做?

这不会工作:

module Mygem
  module BelongsToFoo

    def valid_options
      super + [:foo]
    end

    #... other functionality
  end
end

class ActiveRecord::Associations::Builder::BelongsTo
  extend MyGem::BelongsToFoo
end

安慰

ActiveRecord::Associations::Builder::BelongsTo.valid_options.include? :foo
#=> false   ... :(

Event
ArgumentError: Unknown key: foo

belongs_to source code

================================================== ===========================
更新

流动delwyns answer我试着对我的代码进行另一次审视,他说得对,但它应该被包括在内但ActiveRecord :: Associations :: Builder :: BelongsTo也有一个变量valid_options.

所以我能做到

ActiveRecord::Associations::Builder::BelongsTo.new(:a,:b,:c).valid_options.include? :foo
# => true

但是也

ActiveRecord::Associations::Builder::BelongsTo.valid_options.include? :foo
# => true

所以它应该看起来像这样

module MyGem
  module BelongsToFoo
    extend ActiveSupport::Concern

    included do
      self.valid_options += [:foo]
    end

    def valid_options
      super + [:foo]
    end

    def define_callbacks(model,reflection)
      # this wont get executed
      add_foo_callbacks(model,reflection)# if options[:foo]
      super
    end

    def add_foo_callbacks(model,reflection)
      # therefore this wont either 
    end
  end
end

即使我试试这个

module MyGem
  module BelongsToFoo

    def define_callbacks(model,reflection)
      raise "dobugging"
    end
  end
end

什么都不会发生,Rails完全忽略我的方法覆盖

所以是的,我可以定义自己的选项,但他们什么都不做:(任何建议?

解决方法

有一种用于扩展关联代理的内置方法,请参阅 http://guides.rubyonrails.org/association_basics.html#association-extensions

class Event < ActiveRecord::Base
  belongs_to :users,:extend => MyGem::SpecialTouch
end

module MyGem
  module SpecialTouch
    def touch
      # do the magic
    end
  end
end

那么你当然可以覆盖或别名链belongs_to,以便它从options hash弹出你的:foo选项,将其转换为正确的:extend => ……(真的或有效地)调用belongs_to.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读