Ruby on rails 3 如何从表记录的子集创建Rails模型

Ruby on rails 3 如何从表记录的子集创建Rails模型,ruby-on-rails-3,ruby-on-rails-3.1,rails-models,Ruby On Rails 3,Ruby On Rails 3.1,Rails Models,我正在尝试创建几个模型,它们都来自同一张表。如何限制每个模型中的表记录?在您告诉我更改数据结构之前,这是一个报告应用程序,它从一个我无法控制的现有后台数据库中提取 我的桌子看起来像: Vehicle_Table id vehicle_type name -------------------- 1 Car Foo 2 Car Bar 3 Motorcycle Baz 4 Car Barf 我想为汽车和摩托车制作模型,比如: cl

我正在尝试创建几个模型,它们都来自同一张表。如何限制每个模型中的表记录?在您告诉我更改数据结构之前,这是一个报告应用程序,它从一个我无法控制的现有后台数据库中提取

我的桌子看起来像:

Vehicle_Table
id vehicle_type name
--------------------
1  Car          Foo
2  Car          Bar
3  Motorcycle   Baz
4  Car          Barf
我想为汽车和摩托车制作模型,比如:

class Car < ActiveRecord::Base
  set_table_name 'Vehicle_Table'

end
class-Car

class摩托车
但我不知道如何说,“嘿,活动记录,我只想要摩托车模型中车辆类型=摩托车的记录。”


我确信这是很明显的,但是我的所有Google搜索都返回在模型中查找子集的方法,而不是将模型限制在特定的记录子集。

这称为单表继承(STI)

如果表中有一个名为
type
的列,它可能会自动工作。但是您可以更改Rails用来区分类型的列名

单表继承 活动记录通过将类的名称存储在默认名为“type”的列中(可以通过覆盖Base.heritation\u列来更改)来允许继承。这意味着继承如下所示:

class公司
执行Firm.create(:name=>“37signals”)时,此记录将以type=“Firm”保存在companys表中。然后可以使用Company.where(:name=>'37signals')再次获取此行。首先,它将返回一个固定对象

所以,试试这个代码

class Car < ActiveRecord::Base
  set_table_name 'Vehicle_Table'
  self.inheritance_column = :vehicle_type
end
class-Car
在上面发表了评论,但编辑能力有限。我遇到了这个问题,并在别处找到了解决方案的后半部分。STI将允许您根据表中的列获取表的子集,但它将关闭类名的键以查找该类的记录。例如:

class Company < ActiveRecord::Base; end    
class Client < Company; end

好吧,这是有道理的。当然,现在我遇到了“类型”数据被规范化并存储在另一个表中的问题。所以不是所有的“车”记录都有vehicle_type=“car”,我有的是vehicle_type=1,然后是一个vehicle type表。@BruceP。亨利:是的,这让事情复杂化了。你能去规范化吗?我真的不能。我正在处理另一个应用程序的数据模式(实际上是JIRA),他们做了一些打破各种Rails惯例的事情(JIRA似乎是java应用程序)。好吧,如果我是你,我会使用一些。嘿!但这确实让我畅通无阻。一旦我确定STI是如何做到这一点,我就能够在mySQL中创建一个视图,而不会中断其他应用程序的模式。现在我有了一个非规范化的表,可以从中提取。事实上,这让我认为,进行这种“将Rails附加到另一个程序的DB”的一种好模式是创建具有Rails按照惯例所期望的视图名和列名的视图。这样一来,你所有的模型突然变得简单多了。谢谢你的帮助!在Rails-4.2中,只有将sti_name()定义为实例方法而不是类时,这才有效。所以放下
自我。
class Car < ActiveRecord::Base
  set_table_name 'Vehicle_Table'
  self.inheritance_column = :vehicle_type
end
class Company < ActiveRecord::Base; end    
class Client < Company; end
class Company < ActiveRecord::Base
  self.inheritance_column = :company_type
end
class Client < Company
  def self.sti_name
    1
  end
end
  private

  self.inheritance_column = :company_type

  def sti_name
    1
  end