4

我正在尝试创建几个模型,它们都从同一个表中提取。如何限制每个模型中的表记录?在你告诉我改变我的数据结构之前,这是一个报告应用程序,它从我无法控制的预先存在的支持数据库中提取。

我的桌子看起来像:

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 Motorcycle < ActiveRecord::Base
  set_table_name 'Vehicle_Table'

end

但我不知道怎么说,“嘿,Active Record,我只想要摩托车模型中车辆类型 = 摩托车的记录。”

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

4

2 回答 2

5

这称为单表继承 (STI)。

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

http://api.rubyonrails.org/classes/ActiveRecord/Base.html

单表继承

Active Record 通过将类的名称存储在默认命名为“type”的列中来允许继承(可以通过覆盖 Base.inheritance_column 来更改)。这意味着继承看起来像这样:

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

当您执行 Firm.create(:name => "37signals") 时,此记录将保存在类型 =“Firm”的公司表中。然后,您可以使用 Company.where(:name => '37signals').first 再次获取该行,它将返回一个 Firm 对象。

所以,试试这段代码

class Car < ActiveRecord::Base
  set_table_name 'Vehicle_Table'
  self.inheritance_column = :vehicle_type
end
于 2012-02-14T23:55:28.590 回答
3

上面有评论,但编辑能力有限。我遇到了这个确切的问题,并在其他地方找到了解决方案的后半部分。STI 将允许您根据表中的列获取表的子集,但它将关闭类名以查找该类的记录。例如:

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

这将在名为 Company 的表中查看名为“Type”的列中具有值“Client”的记录。

您可以通过执行覆盖 STI 检查的列

class Company < ActiveRecord::Base
  self.inheritance_column = :company_type
end

但它仍会查找该列以包含“客户”。您可以通过执行以下操作覆盖它查找的值:

class Client < Company
  def self.sti_name
    1
  end
end

现在将查看值为 1 的行的 company_type 列。

对于 Rails-4.2,这几乎相同,但不需要类方法:

  private

  self.inheritance_column = :company_type

  def sti_name
    1
  end
于 2015-07-23T04:05:18.503 回答