• 我们也是 而且是在生产环境的 base 镜像中就写入了

  • 分析 Ruby 中的比较函数 at 2017年1月01日

    #2楼 @xiaoping_rubyist 呃,这也算复杂啊 那么你一定没写过 php

    另外还有一个很腻害的, 就是传说中的宇宙飞船 <=>

    再另外,一说到 === 就提 case…when 其实埋没了它的实用价值,我一直用它来做正则检测,感觉比 =~ 用起来舒服

  • 为什么会出现死循环 at 2016年12月26日

    是不是你 13 这条记录的 parent 指向了自己

    尝试用一下自连接来解决这类问题吧 http://guides.ruby-china.org/association_basics.html#%E8%87%AA%E8%BF%9E%E6%8E%A5

  • 诶 我又回来了 接 #25 楼贴的图 那个就是 model 生成关联属性的方法,它指明了 as 这种关联的 type 是 owner.class.base_class.name owner 是当前的 AR 记录,可以看到它取的 base_class 的名称

    Car.first.association('prices').owner.class.base_class.name #=> "Car"
    Bicycle.first.association('prices').owner.class.base_class.name #=> "Car"
    

    当然,这里只是取值的时候,如果要强行篡改,可以在它初始化之后修改它的接收器 attributes,但是这是个内部变量,我没有找到可以用来修改的 setter,也就怪不得那个歪果仁提了个 PR 来处理这个问题

    另外我上面也提到了,这是一种设计的行为,并非 bug,即使抛开类继承这种限制。而且我同意 #32 的看法,这里应该是不影响使用的吧,只是数据上面 "prices"."priceable_type"Car, Bicycle 的数据也是记录在 cars 表中,这样的数据库设计是健壮的,脱离 rails 也是没问题的

    如果真的是 "prices"."priceable_type" 存的 bicycle, 但是根本没有 bicycles 这张表,Bicycle 只出现在 cars 表中有个叫 type 的字段上。。。。。当这个数据库脱离了你的代码,换一个系统来驱动时,估计你同事会骂死你,哈哈哈~

  • 呃 我结合 #20963 那个 PR 看了下 Rails 的实现,我上面关于 类变量 的猜测应该是不对的,这里不是类变量导致的

    按这个来看,Rails 直接指定了使用 base_class.name ,看来是有意为之啊

  • 其实我不建议 Bicycle < Car 除非从对象自身来说他们就是继承关系,比如 Polo < Car

    如果你只是想实现代码复用,可以尝试用一下 Model 的 concerns,然后在 Bicycle 和 Car 中去 include。模型间的关系,老老实实在每个模型里声明就好了。

  • 其实我已经在第三条回复里写出答案了,但是当时在车上,没法验证,我又给删了,23333 ~~~

    这个行为和 Rails 是没什么关系的,先看个栗子:

    class A 
      @@n = self.name
      def self.my_name
        @@n
      end
    end
    
    class B < A
      def self.b_name
        @@n
      end
    end
    
    puts A.my_name #=> "A"
    puts B.my_name #=> "A"
    puts B.b_name #=> "A"
    

    类继承的时候,是会连着类变量一起继承的

    Car 这个类在初始化的时候,会写入一个类变量 @@priceable_type = car Bicycle 在继承的时候并不会主动去改写这个变量

    因为这是 ruby 本身的行为, 所以 Rails 开发组认为这种行为就是符合预期的行为。如果真的按楼主设想的那种行为去修改 rails 的话,仔细想想对开发者反而会成为一种负担,因为模型间关系的可读性会变得很差,需要跳多个文件才能理清楚关联关系,在一个稍微复杂一点的系统里这简直就是个噩梦。

  • 看了几遍才明白你想表达什么 代码贴错了吧

  • 奇葩 带参数 at 2016年11月24日

    前两天我也刚纠结过这个问题,看心情吧 😄