RoR: Как изменить поля в операторе Join, сгенерированном функцией суммы Active Record - PullRequest
0 голосов
/ 16 ноября 2009

Я делаю сумму, используя функцию Sum, предоставляемую активной записью RubyOnRails, следующим образом:

s=DatosMateria.sum('inscritos',:conditions=> "datos_materia.ano=2005 AND materias.codigo=2394",:include=>"materias")

возвращает 0 и генерирует следующую инструкцию SQL:

SELECT sum('datos_materia'.inscritos) AS  sum_inscritos FROM 'datos_materia' LEFT OUTER JOIN 'materias' ON materias.codigo=datos_materia.id WHERE..

Мне нужно присоединиться к полям materias.codigo = datos_materia.materia_codigo вместо materias.codigo = datos_materia.id (materias.codigo и datos_materia.id являются первичными ключами, и они не одного типа и не связаны между собой. )

Соответствующие модели показаны ниже:

 
class DatosMateria < ActiveRecord::Base
    set&#95;table&#95;name 'datos_materia'
    has&#95;many :materias,:foreign&#95;key => 'codigo'
end</p>

<p>class Materia < ActiveRecord::Base
    set&#95;primary&#95;key 'codigo'
    belongs&#95;to :datosMateria, :foreign&#95;key=> 'materia_codigo'
end

1 Ответ

0 голосов
/ 17 ноября 2009

Редактировать: После доработки этого поста я пришел к выводу, что ваши отношения между Materia и DatosMateria неверны. Похоже, у вас есть принадлежащие назад и has_many назад. Вы упоминаете, что materias.codigo и datos_materia.id являются первичными ключами. То, что вы хотите присоединиться к первичному ключу materia, подразумевает, что materia должно иметь много datos_materia, а не наоборот, как определяются ваши ассоциации.

Вкратце: описание ваших ассоциаций и проблем, похоже, пытались сохранить первичный ключ одной стороны отношения один-ко-многим в качестве внешнего ключа для многих сторон. Это не так, как работают реляционные базы данных. Обычно они используют принцип «один ко многим», в котором первичный ключ связанной записи будет храниться как внешний ключ.

Похоже, некоторые вещи потерялись в переводе. Итак, вот лучшее объяснение того, что не так с вашими отношениями.

Rails ожидает, что внешние ключи будут называться "# {foreign_class} _id", и будет хранить идентификатор, связанный с внешним классом. Внешний ключ всегда находится на стороне принадлежащих вещей.

С отношениями, определенными в вопросе.

Все вспомогательные методы ассоциации, вызываемые в DatosMateria или его экземпляре, присоединяются к datos_materia.id = materias.codigo.

Там, где ожидается, что foreig \ n_key будет materias.codigo. Но materias.codigo - первичный ключ, так как материя может быть связана с datos_materia?

@datos_materia.materias.create

Создаст новую запись Материи с @ datos_materia.id, хранящуюся в столбце Материи codigo. Где при установлении отношений, наоборот, будет создан новый материал с @ datos_materia.materia_codigo, который хранится в столбце codag материалов.

Materia.create(:datos_materia => @datos_materia)

Вспомогательные методы ассоциирования, вызываемые в Materia, или их экземпляры присоединяются к datos_materia.id = materias.materia_codgio

Простого исправления не существует. Вам нужно будет переопределить ваши модели и полностью переработать ваши таблицы. Предполагая, что вы пытаетесь настроить, что одна материя имеет много datos_materia. Вот правильно определенные отношения, которые вы собирались:

class DatosMateria < ActiveRecord::Base
  set_table_name 'datos_materia'
  belongs_to :materias, :foreign_key => :materia_codigo
end

class Materia < ActiveRecord::Base
  has_many :datos_materias, :foreign_key => :materia_codigo
end

Однако, если вы правильно определили свои отношения, ваша сумма будет работать должным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...