0

同じモデルに 2 つの関連付けを持つモデルがあります。

class Mail < ActiveRecord::Base
  belongs_to :user, :class_name => 'UserFrom', :foreign_key => 'user_from'
  belongs_to :user, :class_name => 'UserTo', :foreign_key => 'user_to'
end

index アクションで次のコードを実行すると、正しい関連モデルが取得されません。何か提案はありますか?

@mails = Mail.where('user_to = ?', current_user.id)

debug各行でデータを使用すると、次のように表示されます。

---
- !ruby/object:Mail
  attributes:
    id: 1
    created_at: 2013-02-13 21:17:41.962000000 Z
    updated_at: 2013-02-13 21:17:41.962000000 Z
    user_to: 1
    user_from: 2
    subject: Testing
    body: Mail body blah blah blahhh
    read:
    read_at:
4

2 に答える 2

1

オプションはRailsによく伝えます:class_name...クラス名。ここでは (私は想定しています)、UserFrom または UserTo というクラスを持っていません。app/models に User というクラスが 1 つあります。

class Mail < ActiveRecord::Base
  belongs_to :user_from, :class_name => 'User', :foreign_key => 'user_from'
  belongs_to :user_to,   :class_name => 'User', :foreign_key => 'user_to'
end

_id外部キーが適切に設定されており、サフィックスがなくても両方にユーザー ID が含まれていると仮定します。

に関しては@mails、クエリが機能するはずです。ただし、ユーザーで関連付けを宣言すると、より簡単になりhas_many :mailsます。これにより、次のようなことが可能になりますcurrent_user.mails

于 2013-02-13T22:18:22.970 に答える
1

同じ名前のリレーションを持つことはできません。リレーションの名前を変更する必要があります。これは例です:

class Mail < ActiveRecord::Base
  belongs_to :sender, :class_name => 'User', :foreign_key => 'user_from'
  belongs_to :receiver, :class_name => 'User', :foreign_key => 'user_to'
end

また、読みやすくするために、「sender_id」や「receiver_id」などの外部キーの名前を変更することをお勧めします。

使用法:

@mails = Mail.where(sender: current_user)
于 2013-02-13T22:18:42.730 に答える