2016-07-28 61 views
0

这不是一个家庭作业问题。我正在努力学习更多。由A然后B使用Ruby on Rails订购型号

我有一个属性
Manufacturer {name} //商店Manufactueres
Model {manufacturer_id, name} //商店模式
Tint {manufacturer_id, model_id, front, side, rear} //商店测量

我在Tint实体后续数据下列实体。字母表示不同的制造商名称和型号。

Manufacturer | Model | Front | Side | Rear | 
-------------+-------+-------+------+------- 
A   | AD | 10 | 10 | 10 | 
B   | AB | 10 | 10 | 10 | 
A   | AA | 10 | 10 | 10 | 
A   | AC | 10 | 10 | 10 | 
B   | AA | 10 | 10 | 10 | 
A   | AB | 10 | 10 | 10 | 

当我view打印出来,我想有它排序基于Manufacturer名称,然后Model。所以结果如下。制造商的名称将按字母顺序排序,然后是模型。

Manufacturer | Model | Front | Side | Rear | 
-------------+-------+-------+------+------- 
A   | AA | 10 | 10 | 10 | 
A   | AB | 10 | 10 | 10 | 
A   | AC | 10 | 10 | 10 | 
A   | AD | 10 | 10 | 10 | 
B   | AA | 10 | 10 | 10 | 
B   | AB | 10 | 10 | 10 | 

我所建立的模型,以确保ManufacturerModel是一个明显的对值。

我的问题是,因为我使用manufacturer_idmodel_id参考,我如何从ManufacturerModel表得到ManufacturerModel的名称。

在我的tints_controller.rb中,我有@tints = Tint.all.order(:manufacturer_id)。但是,它只会根据manufacturer_id(如数字)而不是制造商名称进行排序。

我知道我可以用SQL方式在RoR模型中执行(SELECT, FROM, WHERE)。但是,我想知道是否可以使用ActiveRecord根据其名称对数据进行排序。

回答

0

回答我的问题:

tints_controller.rb,我写了 @tints = Tint.joins(:manufacturer, :model).order("manufacturers.name ASC, models.name ASC")加入表相应地命令它们。

我试过@Goston上面提供的答案,当我尝试编辑tints时遇到问题。它不允许我编辑。

注意:@Goston提供的答案将命令他们,但它打破了edit函数为我的情况。

0

任何时候你有Rails的一个实体的id,您可以轻松简单地通过实例化实体检索等相关的领域:

@manufacturer = Manufacturer.find(params[manufacturer_id]) 

那么它是一个简单的事情,以获取任何其他领域:

@manufacturer_name = @manufacturer.name 

如果你需要的制造商或制造商名称的集合,那么它的最好立即建立自己通过作用域查询一个ActiveRecord::Relation对象(如你已经知道)。我不知道你的标准是什么,否则,我会提供一些示例代码。通过要将ActiveRecord::Relation排序

@manufacturers = Manufacturer.where("some_column = ?", some_criterion).order(:sort_field) 

在上面的例子中,:sort_field将是场:我可以告诉你,你的范围的查询应包括一个.order子句结束。我猜你的情况是:name

所有这些都已经说过了,如果你想要花哨的排序表,你应该看看JQuery DataTables宝石。 DataTables可以为你做很多繁重的工作,这对你的用户来说很方便,因为他们可以根据你提供的任何列进行排序和求助。

+0

我完全得到你想说的,但我有点失落。我知道我可以用'@ manufacturer.name'来获取制造商的名称。由于我在'Tint'控制器中,我如何通过修改'@ tints = Tint.all.order(:manufacturer_id)'来植入下面的代码。我试图在最后一个小时里弄清楚,但我仍然迷失。 –

2

如果我理解正确,你有3个模型,色调,制造商和型号。我假设你有适当的has_many和belongs_to associations正确设置。

Tint.rb 
belongs_to :workspace 

Manufacturer.rb 
has_many :models 
has_many :tints, through: :models 

Model.rb: 
belongs_to Manufacturer 
has_many :tints 

您需要的三款车型第一联合起来,然后才能通过一些标准

tints_controller.rb 
@tints = Tint.joins(model: :manufacturer).order('manufacturers.name, models.name').pluck('manufacturers.name, models.name, tints.front, tints.side, tints.rear') 

这会给你所有的色彩记录,他们appropiate型号和制造商。

+0

是的,你正确理解问题,我在模型中有以下关系。不过,我试图避免使用SQL连接。 –

0

在你tints_controller.rb的

@tints = Tint.all.order(:manufacturer_id) 

instedad请写:

@tints = Tint.all.order(:manufacturer_id, :model_id) 
+0

我昨天试过,这不起作用,因为它只会对ID而不是模型和制造商的名称进行排序。 –