2015-01-02 7 views
0

Я хочу, чтобы загрузить коллекцию ActiveRecord с соответствующей коллекцией усердия:Заказав has_many через ассоциацию

class BodyPort < ActiveRecord::Base 
    has_many :body_port_dimensions 
    has_many :dimensions, through: :body_port_dimensions, order: 'dimensions.value' 
    scope :ordered, order('name ASC') 
end 
class BodyPortDimension < ActiveRecord::Base 
    belongs_to :dimension 
end 
class Dimension < ActiveRecord::Base 
end 

нетерпеливыми загрузками ассоциации:

BodyPort.includes(:dimensions).ordered 

генерирует SQL:

SELECT `body_ports`.* 
    FROM `body_ports` 
    ORDER BY name ASC 
SELECT `body_port_dimensions`.* 
    FROM `body_port_dimensions` 
    WHERE `body_port_dimensions`.`body_port_id` IN (3, 5, 7, 6, 2, 8, 9, 4, 1) 
    ORDER BY dimensions.value 

, который вызывает исключение SQL:

=> ActiveRecord::StatementInvalid: Mysql2::Error: 
    Unknown column 'dimensions.value' in 'order clause': 
    SELECT `body_port_dimensions`.* 
    FROM `body_port_dimensions` 
    WHERE `body_port_dimensions`.`body_port_id` IN (3, 5, 7, 6, 2, 8, 9, 4, 1) 
    ORDER BY dimensions.value 

Как создать внутреннее соединение SQL, как вместо того, чтобы:

SELECT `dimensions`.* 
    FROM `dimensions` 
    INNER JOIN `body_port_dimensions` 
    ON `dimensions`.`id` = `body_port_dimensions`.`dimension_id` 
    WHERE `body_port_dimensions`.`body_port_id` IN (3, 5, 7, 6, 2, 8, 9, 4, 1) 
    ORDER BY dimensions.value 
+0

Это похоже на известную (и исправленную в рельсах 4) ошибку с версией рельсов, которую вы используете: https://github.com/rails/rails/issues/8663 – FaithoftheFallen

ответ

2

после edsinclair patch:

конфигурации/Инициализаторы/extensions.rb:

require "active_record_has_many_through_patch" 

Библиотека/active_record_has_many_through_patch.rb :

module ActiveRecordHasManyThroughPatch 
    def self.through_options 
    through_options = {} 

    if options[:source_type] 
     through_options[:conditions] = { reflection.foreign_type => options[:source_type] } 
    else 
     if options[:conditions] 
     through_options[:include] = options[:include] || options[:source] 
     through_options[:conditions] = options[:conditions] 
     end 

     if options.has_key?(:order) 
     through_options[:order] = options[:order] 
     if options.has_key?(:through) && options.has_key?(:source) 
      through_options[:include] = options[:source] 
     end 
     end 
    end 

    through_options 
    end 
end 
Смежные вопросы