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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |