2013-03-14 48 views
3

的Rails 3.2.11 MySql2宝石我的发现者很疯狂。 (.find返回错误的类?)

嗨,没有任何人有一个想法,为什么我的查找方法返回一个错误类型的ActiveRecord的?

这里的模型:

class NameList < ActiveRecord::Base 
    attr_accessible :name, :selected, :type 
    self.table_name='name_lists' 
end 

这里是控制台输出:

>> k=NameList.find(28) 
NameList Load (0.0ms) SELECT `name_lists`.* FROM `name_lists` WHERE `name_lists`.`id` = 28 LIMIT 1 
#<Neighborhood id: 28, name: "Bayview"> 

>> k.class 
Neighborhood(id: integer, city_id: integer, name: string, street_count: integer, relative_value: float, home_count: integer, min_lot_size: integer, created_at: datetime, updated_at: datetime) 

请注意,我打电话NameList.find,但我得到的回复是邻居对象。奇怪的是,sql似乎是正确的 - 它查询NameList表。

没有什么特别之处邻里对象:下面是该模型:

class Neighborhood < ActiveRecord::Base 
    belongs_to :city 
    has_many :streets 
    attr_accessible :name, :relative_value, :street_count 
    def self.make(name, relative_value, min_lot_size, street_count, home_count) 
    n=Neighborhood.new 
    n.name = name 
    end 
end 

当我尽量存起来 - 它使用了邻里模式的定义并尝试更新错误的表。

> k.name = "Foo" 
"Foo" 

>> k.save 
(1.0ms) BEGIN 
(0.0ms) UPDATE `neighborhoods` SET `name` = 'Foo', `updated_at` = '2013-03-14 17:40:46' WHERE `neighborhoods`.`id` = 28 
(0.0ms) COMMIT 
true 

任何想法?

回答

6

你已经偶然发现了Rails单表继承(STI),如果你在表中添加一个'type'列,你立即就会得到它。本质上,该对象是从名称与该记录中的类型列值相匹配的类实例化的。

如果您想了解STI,请阅读here,查找Single Table Inheritance部分。在你的情况下,我敢打赌,你并不是真的想要这样的行为,所以你的解决方案是重新命名列类似类似,类别或任何有意义的东西

+0

感谢就是这样。 – user1023110 2013-03-14 18:13:09

+0

您还可以选择重命名STI列,以便仍然可以使用'type'作为列的名称。 – aromero 2013-03-15 04:03:50

+0

这是正确的。但是,如果可能的话,我仍然倾向于重新命名列,因为它不那么具有误导性。当你命名一个'类型'列时,你正在设定某些期望值。任何有经验的ROR开发人员都会看到该专栏,并假定您打算使用STI。 – boulder 2013-03-15 15:56:30

0

如果需要列名type但是,你可以在每个模型的基础上关闭Single Table Inheritance。请参阅我的回答this post