2013-07-19 3 views
0

Я пытаюсь связать две таблицы друг с другомRails belongs_to возвращает ноль класс

class Musers < ActiveRecord::Base 
    # Email 
    # sid (student_id:integer) 
    # isyk: boolean 

    belongs_to :user, :foreign_key => "smail" 
end 

class Users < ActiveRecord::Base 

    belongs_to :muser, :foreign_key => "email" 

end 

Но

@user = Users.first 
@user.muser returns nil 
+0

В полученных ответах объясняется основная проблема, однако есть также проблема с тем, как вы создаете '@ user'. Вы не должны дублировать имя модели. Вместо этого используйте '@user = User.first'. –

+0

@JamesChevalier user = Users.first создает пользователя не User.first, он говорит о неинициализированной константе – Yagiz

+0

@Yagiz. Вы должны переименовать 'Users' в' User' и 'Musers' в' Muser'. Модели Rails должны быть названы в их единственном виде. –

ответ

1

Говоря :foreign_key => "smail" вы говорите рельсы, что Muser столбец smail указывает на User внешний ключ модели. Скорее всего, это не так.

Предполагая, что первичный ключ User моделей называется id, вы должны user_id поле Muser и изменить belongs_to :user, :foreign_key => "smail" в:

belongs_to :user 

На User модели вы можете определить обратную связь с помощью:

has_one :muser 

Кроме того, чтобы следовать рельсы модели соглашения о присвоении имен, вы должны переименовать Users в User и Musers - Muser.

Вы должны узнать больше о belongs_to и has_one.

Если, с другой стороны, модель User фактически использует электронную почту для ее первичного ключа, я настоятельно рекомендую вам ее изменить и вместо этого добавить первичный ключ с автоматическим добавлением. Как правило, первичный ключ следует выбирать таким образом, чтобы он никогда не менялся. Если он изменится, все внешние ключи, указывающие на этот первичный ключ, также должны измениться. Вы должны использовать первичный ключ без автоматического увеличения, если у вас есть определенная причина для этого.

Более подробная информация о выборе первичного ключа: How to choose my primary key?

1

Ну вы не можете просто сказать рельсам типа ассоциации, вы действительно должны установить связь с экземпляром этого класса. Например, создание нового устройства не будет автоматически назначать пользователя как belongs_to. Вы могли бы сделать что-то вроде

u = User.new 
u.muser = Muser.first 
u.save 

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

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