[RUBY-ON-RAILS] 레일에 루비 - 두 번 같은 모델을 참조?
RUBY-ON-RAILS레일에 루비 - 두 번 같은 모델을 참조?
그것은이 비계 명령을 생성을 통해 액티브 모델의 이중 관계를 설정 할 수 있습니까?
나는 사용자 모델과 PrivateMessage 모델이 있다면 예를 들어, private_messages 테이블은 보낸 사람과받는 사람 모두를 추적해야합니다.
물론, 하나의 관계를 그냥 이런 짓을 했을까 :
ruby script/generate scaffold pm title:string content:string user:references
이 개 관계를 설정하는 비슷한 방법이 있나요?
또한, 관계의 설정 별칭 어쨌든 무엇입니까?
그래서 오히려 말보다 더 :
@message.user
당신은 같은 것을 사용할 수 있습니다 :
@ message.sender 또는 @ message.recipient
어떤 조언을 주시면 감사하겠습니다.
감사.
해결법
-
==============================
1.당신의 모델이 추가
당신의 모델이 추가
has_one :sender, :class_name => "User" has_one :recipient, :class_name => "User"
그리고 당신은 사용자 모델 @ message.sender 및 @ message.recipient 모두 참조를 호출 할 수 있습니다.
대신 사용자의 : 당신의 생성 명령 참조하면 보낸 사람이 필요한 것 : 참조 및받는 사람 : 참조
-
==============================
2.다음은이 문제에 대한 완전한 답은이 질문을 방문하는 경우 사람들에의 레일에 루비에 새로운과 (내가 처음이로 보았을 때 나는이었다로) 함께 최선을 다하는 힘든 시간을 보내고.
다음은이 문제에 대한 완전한 답은이 질문을 방문하는 경우 사람들에의 레일에 루비에 새로운과 (내가 처음이로 보았을 때 나는이었다로) 함께 최선을 다하는 힘든 시간을 보내고.
솔루션 걸릴 당신의 마이그레이션에 자리하고 모델에서 일부의 일부 :
class CreatePrivateMessages < ActiveRecord::Migration def change create_table :private_messages do |t| t.references :sender t.references :recipient end # Rails 5+ only: add foreign keys add_foreign_key :private_messages, :users, column: :sender_id, primary_key: :id add_foreign_key :private_messages, :users, column: :recipient_id, primary_key: :id end end
보낸 사람과 :받는 사람과 다른 테이블에 대한 참조를 개최 여기로 언급 될 것이다이 테이블에 두 개의 열이 있다는 것을 지정한다. 레일은 실제로 당신을 위해 'SENDER_ID'와 'recipient_id'라는 열을 생성합니다. 우리의 경우 그들은 각 기준 Users (사용자) 테이블의 행,하지만 우리는하지 마이그레이션에서 모델 것을 지정합니다.
class PrivateMessage < ActiveRecord::Base belongs_to :sender, :class_name => 'User' belongs_to :recipient, :class_name => 'User' end
, 보낸 사람이 프로퍼티는 사용자 클래스와 관련이 있음을 지정 : 여기라는 PrivateMessage 모델에 속성을 만들 수 있습니다. 볼 레일은 "belongs_to : 보낸 사람", 우리는 위에서 정의 된 "SENDER_ID"라는 데이터베이스에 열을 찾습니다 및 외래 키를 저장하는 것을 사용합니다. 그럼 당신은받는 사람의 정확한 같은 일을하고 있습니다.
이것은 당신이이 같은 PrivateMessage 모델의 인스턴스를 통해 발신자와 수신자, 사용자 모델의 두 인스턴스에 액세스 할 수 있습니다 :
@private_message.sender.name @private_message.recipient.email
여기에 귀하의 사용자 모델은 다음과 같습니다
class User < ActiveRecord::Base has_many :sent_private_messages, :class_name => 'PrivateMessage', :foreign_key => 'sender_id' has_many :received_private_messages, :class_name => 'PrivateMessage', :foreign_key => 'recipient_id' end
, sent_private_messages을이 속성이 PrivateMessage 모델과 관련이 있음을 지정하고이 속성에 관련된 PrivateMessage 모델에 대한 외부 키를 호출 할 때 'SENDER_ID': 여기라는 이름의 사용자 모델의 속성을 만들 수 있습니다. 그럼 당신은받은 비공개 메시지에 대해 같은 일을하고 있습니다.
이것은 당신이 보내거나 이런 일을 수행하여 비공개 메시지를받은 사용자를 모두 얻을 수 있습니다 :
@user.sent_private_messages @user.received_private_messages
이 중 하나 그럴 경우 PrivateMessage 모델의 인스턴스의 배열을 반환합니다.
....
-
==============================
3.안녕 양측 관계는 당신의 두 모델에서 다음과 같은 설정을 수행해야합니다 :
안녕 양측 관계는 당신의 두 모델에서 다음과 같은 설정을 수행해야합니다 :
class Message < ActiveRecord::Base belongs_to :sender, :class_name => "User", :foreign_key => "sender_id" belongs_to :recipient, :class_name => "User", :foreign_key => "recipient_id" end class User < ActiveRecord::Base has_many :sent, :class_name => "Message", :foreign_key => "sent_id" has_many :received, :class_name => "Message", :foreign_key => "received_id" end
나는이 도움을 바랍니다 ...
-
==============================
4.위의 답변은 우수한 반면, 데이터베이스의 외래 키 제약, 대신에서만 생성 인덱스와 BIGINT 컬럼을 작성하지 않습니다. 외래 키 제약 조건이 적용되어 있는지 확인하려면 이전에 다음을 추가합니다 :
위의 답변은 우수한 반면, 데이터베이스의 외래 키 제약, 대신에서만 생성 인덱스와 BIGINT 컬럼을 작성하지 않습니다. 외래 키 제약 조건이 적용되어 있는지 확인하려면 이전에 다음을 추가합니다 :
class CreatePrivateMessages < ActiveRecord::Migration[5.1] def change create_table :private_messages do |t| t.references :sender t.references :recipient end add_foreign_key :private_messages, :users, column: :sender_id, primary_key: :id add_foreign_key :private_messages, :users, column: :recipient_id, primary_key: :id end end
이 인덱스는 SENDER_ID에 생성 및 사용중인 데이터베이스의 외래 키 제약 조건뿐만 아니라 recipient_id 얻을 수 있도록합니다.
from https://stackoverflow.com/questions/2057210/ruby-on-rails-reference-the-same-model-twice by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 루비 : PDF 파일을 읽기 (0) | 2020.02.28 |
---|---|
[RUBY-ON-RAILS] 어떻게 URL에 루비에서 문자열을 인코딩 (0) | 2020.02.27 |
[RUBY-ON-RAILS] 레일 - 데이터 - * 속성을 가진 LINK_TO 도우미 [중복] (0) | 2020.02.27 |
[RUBY-ON-RAILS] 루트 도메인에 Heroku가 SSL (0) | 2020.02.27 |
[RUBY-ON-RAILS] 어떻게 SQL은 레일 콘솔에서 쿼리를 실행 보여? (0) | 2020.02.27 |