Rails 3 объединяется с нестандартными ключевыми полями - PullRequest
0 голосов
/ 03 февраля 2011

Я погуглил себя почти до смерти из-за этого, и самое близкое, что я нашел к чему-либо подобному, это этот вопрос переполнения стека (который пытается задать несколько вопросов одновременно).У меня есть только один.Хорошо, два - но если вы ответите первым, то ваш ответ будет принят при условии, что он соответствует приведенным ниже требованиям.

Я использую Rails 3 и Ruby 1.8.7 с устаревшей базой данных.Единственное, что подлежит обсуждению - это версия Rails.Я застрял с Ruby 1.8.7 и структурой базы данных.

Вот важные части участвующих моделей:

class List < ActiveRecord::Base
    set_primary_key "ListID"

    has_many :listitem, :foreign_key => "ListID", :dependent => :destroy
    has_many :extra_field, :foreign_key => "ListID", :dependent => :destroy
end

class Listitem < ActiveRecord::Base
    set_table_name "ListItems"
    set_primary_key "ListItemID"

    belongs_to :list
    has_many :list_item_extra_field, :foreign_key => 'ListItemID', :dependent => :destroy
end

Вот что я получаю в консоли rails:

irb(main):001:0> List.joins(:listitem).to_sql
=> "SELECT [lists].* FROM [lists] INNER JOIN [ListItems] ON [ListItems].[ListID] IS NULL"

Когда я ожидаю SQL-выражение, похожее на:

SELECT [lists].* FROM [lists] INNER JOIN [ListItems] ON [ListItems].[ListID] = [Lists].[ListID]

Если я попаду на приведенный выше запрос, то получу правильный ответ.Бонусные баллы, если вы можете сказать мне, как добраться до чего-то эквивалентного:

SELECT [lists].*, COUNT([ListItems].*) FROM [lists] INNER JOIN [ListItems] ON [ListItems].[ListID] = [Lists].[ListID]

Ответы [ 2 ]

0 голосов
/ 04 февраля 2011

Как обычно, ответ нелепо прост с Rails ...

Мои таблицы названы в смешанном регистре.Добавление следующей строки в мою модель List исправило это:

set_table_name "Lists"

Множество (или его отсутствие) :listitem(s), по-видимому, не влияло ни до, ни после этого изменения.

0 голосов
/ 04 февраля 2011

Ваш первый вопрос: вы, наверное, перепутали перенос таблиц.В файле миграции используйте

create_table :lists, {:id => false} do     
....
end

, а затем добавьте execute "ALTER TABLE lists ADD PRIMARY KEY (listid);" И, кстати, это has_many :listitems (множественное число, а не один).

Смотрите подробное объяснение здесь: Используя Rails, как я могу установить, чтобы мой первичный ключ не был столбцом целого типа?

Второй вопрос: я бы использовал комбинацию методов, а не один метод.Вам нужно вернуть имя списка, а затем сосчитать имя элементов списка в этом списке, верно?После решения первой проблемы просто используйте list.name и list.list_items.count

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