RoR: как загрузить связанную запись в отношении один к одному - PullRequest
1 голос
/ 26 мая 2010

У меня есть следующее:

class User < ActiveRecord::Base
 has_one :subscription
end
class Subscription < ActiveRecord::Base
 belongs_to :user
end

У пользователя есть subscription_id и, следовательно, он может иметь только одну подписку (что я и хочу).

Что отлично работает, но теперь я делаю:

@users = User.find(:all)

и я хочу, чтобы все подписки были включены.

Я пытался:

@users = User.find(:all, :include=>[:subscription]) # include subscription

Но для этого в таблице подписок должен быть идентификатор_пользователя (SQLite3 :: SQLException: такого столбца нет: subscription.user_id: ВЫБРАТЬ «подписки». * ОТ »подписки« ГДЕ («подписки» .user_id = 2)).

Что (конечно) не то, что я хочу.

Я новичок в RoR, и я не смог найти хорошего примера этого случая в книгах, которые у меня есть, ни в Интернете.

Ответы [ 2 ]

4 голосов
/ 26 мая 2010

Я думаю, у вас неправильные ассоциации на модельных объектах. Вы должны иметь

class User < ActiveRecord::Base
  belongs_to :subscription
end
class Subscription < ActiveRecord::Base
  has_one :user
end

assign_to следует использовать на стороне ассоциации, которая определяет внешний ключ (в данном случае subscription_id). Семантически это, вероятно, выглядит немного странно, но это потому, что в этом случае rails будет ожидать, что user_id будет в таблице подписок, а не наоборот, как есть.

После этого

User.find(:all, :include=>[:subscription]) 

Должно работать нормально

1 голос
/ 26 мая 2010

Прежде всего, если у пользователя есть внешний ключ (subscription_id), он должен иметь принадлежность_, а не наоборот. Как сказано в документации Rails для метода has_one:

"Этот метод следует использовать только в том случае, если другой класс содержит внешний ключ. Если текущий класс содержит внешний ключ, тогда вместо него следует использовать принадлежать_"

(взято из: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#M001834)

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

@users = User.find(:all, :include=>[:subscription])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...