2012-06-14 68 views
0

首先,我的模型定义:导轨的has_many通过,一群不太工作

class Batch < ActiveRecord::Base 
    has_many :data_files 
    has_many :file_types, :through => :data_files, :group => "data_files.file_type_id" 
end 

class DataFile < ActiveRecord::Base 
    belongs_to :batch 
    belongs_to :file_type 
end 

class FileType < ActiveRecord::Base 
    has_many :data_files 
end 

所以基本上我打算是具有一个或多个数据文件的批次,每个数据文件是一种特殊的类型,我希望能够批量获取所有独特的文件类型。基于上述实施,我本来期望以下工作:

batch.file_types 

但是,group部分似乎并不奏效。换句话说,文件类型列表并非唯一,我必须在处处做到这一点:

batch.file_types.uniq 

我在做什么错了?

编辑: 生成的SQL如下:

SELECT `file_types`.* FROM `file_types` 
INNER JOIN `data_files` ON `file_types`.id = `data_files`.file_type_id 
WHERE ((`data_files`.batch_id = 234)) 
+0

你试过':group =>:file_type_id'吗?请发布生成的SQL。 – Anil

+0

向问题添加了SQL ..谢谢 – Adnan

回答

1

试试这个:

has_many :file_types, :through => :data_files, :uniq => true 

其他多数据库有效的方式做的是:

has_many :file_types, :through => :data_files, :select => "DISTINCT file_types.*" 

祝你好运!

更新为Rails 4
在Rails 4: has_many :file_types, -> { distinct }, through: :data_files

here

+0

这两个工作。谢谢!任何想法为什么:组没有? – Adnan

+0

我有一个多(链)':通过',它会抛出我这个错误'未知的键::uniq。有效的键是::class_name,:class,:foreign_key,:validate,:autosave,:table_name,:before_add,:after_add,:before_remove,:after_remove,:extend,:primary_key,:dependent,:as,:through,: source,:source_type,:inverse_of,:counter_cache,:join_table' – mariowise