0

2 つのテーブルを相互にリンクしようとしています

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
4

2 に答える 2

1

列がモデルの外部キーを指して:foreign_key => "smail"いることをレールに伝えていると言うことです。これはおそらくそうではありません。MusersmailUser

Userモデルの主キーが であると仮定するとid、user_id フィールドをMuserに変更belongs_to :user, :foreign_key => "smail"し、次のように変更する必要があります。

belongs_to :user

モデルでは、User次を使用して逆の関係を定義できます。

has_one :muser

また、Rails モデルの命名規則に従うために、名前UsersUserおよびMusersに変更する必要がありますMuser

belongs_tohas_oneについてもっと読むべきです。

一方、Userモデルが実際に主キーに電子メールを使用している場合は、それを変更して、代わりに自動インクリメント主キーを追加することを強くお勧めします。経験則として、主キーは変更されないように選択する必要があります。変更された場合、その主キーを指すすべての外部キーも変更する必要があります。特定の理由がある場合にのみ、非自動インクリメント主キーを使用する必要があります。

主キーの選択に関する詳細: 主キーの選択方法は?

于 2013-07-19T15:07:36.103 に答える
1

Rails にアソシエーションのタイプを伝えることはできません。実際には、アソシエーションをそのクラスのインスタンスに設定する必要があります。たとえば、新しい muser を作成しても、ユーザーが として自動的に割り当てられるわけではありませんbelongs_to。次のようなことができます

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

ただし、belongs_to - belongs_to の関係で何を達成しようとしているのかはわかりませんが、レールにその存在を伝えるだけでなく、それ以上のことをしなければならないことを知っておく必要があります。

于 2013-07-19T15:07:49.013 に答える