복붙노트

[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. ==============================

    1.당신의 모델이 추가

    당신의 모델이 추가

    has_one :sender, :class_name => "User"
    has_one :recipient, :class_name => "User"
    

    그리고 당신은 사용자 모델 @ message.sender 및 @ message.recipient 모두 참조를 호출 할 수 있습니다.

    대신 사용자의 : 당신의 생성 명령 참조하면 보낸 사람이 필요한 것 : 참조 및받는 사람 : 참조

  2. ==============================

    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. ==============================

    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. ==============================

    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 얻을 수 있도록합니다.

  5. from https://stackoverflow.com/questions/2057210/ruby-on-rails-reference-the-same-model-twice by cc-by-sa and MIT license