복붙노트

[RUBY-ON-RAILS] 어떻게 할 inverse_of합니까? SQL은 어떻게 생성합니까?

RUBY-ON-RAILS

어떻게 할 inverse_of합니까? SQL은 어떻게 생성합니까?

나는 inverse_of 주위에 내 머리를 얻으려고하고 나는 그것을하지 않습니다.

무엇있는 경우, 생성 된 SQL보기 좋아합니까?

has_many : : belongs_to를, 그리고 : has_many_and_belongs_to을 inverse_of 옵션을 사용하면 같은 동작을 나타합니까?

이 같은 기본적인 질문 인 경우 죄송합니다.

나는이 예제를 보았다 :

class Player < ActiveRecord::Base
  has_many :cards, :inverse_of => :player
end

class Card < ActiveRecord::Base
  belongs_to :player, :inverse_of => :cards
end

해결법

  1. ==============================

    1.문서에서, 그것은 것 같다 : 옵션을 생성하지, SQL 쿼리를 피하기위한 방법이다 inverse_of. 그것은 액티브 힌트가 관계를 통해 다시 가져 오는 대신 이미로드 된 데이터를 사용할 수 있습니다.

    문서에서, 그것은 것 같다 : 옵션을 생성하지, SQL 쿼리를 피하기위한 방법이다 inverse_of. 그것은 액티브 힌트가 관계를 통해 다시 가져 오는 대신 이미로드 된 데이터를 사용할 수 있습니다.

    그들의 예 :

    class Dungeon < ActiveRecord::Base
      has_many :traps, :inverse_of => :dungeon
      has_one :evil_wizard, :inverse_of => :dungeon
    end
    
    class Trap < ActiveRecord::Base
      belongs_to :dungeon, :inverse_of => :traps
    end
    
    class EvilWizard < ActiveRecord::Base
      belongs_to :dungeon, :inverse_of => :evil_wizard
    end
    

    이 경우, dungeon.traps.first.dungeon를 호출하면 기본적으로 케이스가 될 것 같은 새로운 하나를로드하는 대신 원래의 던전 개체를 반환해야합니다.

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

    2.내 생각 : 당신이 아직 지속되지 않은 단체와 함께 작업 할 때 inverse_of가 가장 유용합니다. 예컨대 :

    내 생각 : 당신이 아직 지속되지 않은 단체와 함께 작업 할 때 inverse_of가 가장 유용합니다. 예컨대 :

    class Project < ActiveRecord::Base
      has_many :tasks, :inverse_of=>:project
    end
    
    class Task < ActiveRecord::Base
      belongs_to :project, :inverse_of=>:tasks
    end
    

    이제, 콘솔 :

    irb> p = Project.new
    => #<Project id: nil, name: nil, ...>
    irb> t = p.tasks.build
    => #<Task id: nil, project_id: nil, ...>
    irb> t.project
    => #<Project id: nil, name: nil, ...>
    

    포함하지 않는 : 그것이 SQL 쿼리를 트리거 데이터가 아직 저장되지 않기 때문에 inverse_of 인수, t.project는 전무를 반환합니다. 함께 : 인수 inverse_of, 데이터가 메모리에서 검색됩니다.

  3. ==============================

    3.이 홍보 후 (https://github.com/rails/rails/pull/9522) inverse_of는 대부분의 경우 필요하지 않습니다.

    이 홍보 후 (https://github.com/rails/rails/pull/9522) inverse_of는 대부분의 경우 필요하지 않습니다.

    액티브 레코드는 표준 이름을 가진 대부분의 연관에 대한 자동 식별을 지원합니다. 그러나, 액티브 레코드는 자동으로 범위 또는 다음 옵션 중 하나를 포함하는 양방향 연결을 식별하지 않습니다

    class Author < ApplicationRecord
      has_many :books, inverse_of: 'writer'
    end
    
    class Book < ApplicationRecord
      belongs_to :writer, class_name: 'Author', foreign_key: 'author_id'
    end
    
    a = Author.first
    b = a.books.first
    a.first_name == b.writer.first_name # => true
    a.first_name = 'David'
    a.first_name == b.writer.first_name # => true
    

    상기 예에서, 동일한 객체에 대한 참조는 변수 a 및 특성 기록기에 저장된다.

  4. ==============================

    4.모두 그냥 업데이트 - 우리는 단지 has_many와 우리의 애플 리케이션 중 하나 inverse_of 사용 : 협회를 통해

    모두 그냥 업데이트 - 우리는 단지 has_many와 우리의 애플 리케이션 중 하나 inverse_of 사용 : 협회를 통해

    그것은 기본적으로 "아이"개체에 사용할 수있는 "기원"개체를 만드는

    당신은 레일 '예제를 사용하고 그래서 경우 :

    class Dungeon < ActiveRecord::Base
      has_many :traps, :inverse_of => :dungeon
      has_one :evil_wizard, :inverse_of => :dungeon
    end
    
    class Trap < ActiveRecord::Base
      belongs_to :dungeon, :inverse_of => :traps
      validates :id,
          :presence => { :message => "Dungeon ID Required", :unless => :draft? }
    
      private
      def draft?
          self.dungeon.draft
      end 
    end
    
    class EvilWizard < ActiveRecord::Base
      belongs_to :dungeon, :inverse_of => :evil_wizard
    end
    

    사용 : inverse_of 당신이 그것을의 반대가 있다는 데이터 개체에 액세스 할 수 있도록, 더 이상 SQL 쿼리를 수행하지 않고

  5. ==============================

    5.우리가 has_many와 관계 belongs_to 2 개 모델이있을 때, 그것은 그들이 협회의 같은 편에 속한다는 것을 ActiveRecod을 통보하는 inverse_of 사용에 항상 낫다. 그래서 한쪽에서 쿼리가 트리거 될 경우, 캐시하고이 반대 방향에서 트리거받을 경우 캐시에서 제공합니다. 어떤 성능을 향상시킵니다. 우리가 foreign_key 사용하거나 우리가 명시 적으로 설정해야 할 클래스 이름을 변경하는 경우 레일 4.1에서 inverse_of가 자동으로 설정됩니다.

    우리가 has_many와 관계 belongs_to 2 개 모델이있을 때, 그것은 그들이 협회의 같은 편에 속한다는 것을 ActiveRecod을 통보하는 inverse_of 사용에 항상 낫다. 그래서 한쪽에서 쿼리가 트리거 될 경우, 캐시하고이 반대 방향에서 트리거받을 경우 캐시에서 제공합니다. 어떤 성능을 향상시킵니다. 우리가 foreign_key 사용하거나 우리가 명시 적으로 설정해야 할 클래스 이름을 변경하는 경우 레일 4.1에서 inverse_of가 자동으로 설정됩니다.

    자세한 내용 및 예를 들어 베스트 자료.

    http://viget.com/extend/exploring-the-inverse-of-option-on-rails-model-associations

  6. ==============================

    6.이 문서를 살펴 보자!

    이 문서를 살펴 보자!

    http://gsusmonzon.blogspot.com.br/2011/09/rails-power-of-inverseof.html

  7. ==============================

    7.두 모델, 사용자 및 역할 사이 has_many_through 관계를 가지고, 그리고 validates_presence와 비 존재 또는 잘못된 항목에 대한 연결 모델 할당을 확인하려면 다음 USER_ID : ROLE_ID를, 그것은 유용합니다. 당신은 여전히 ​​그의 협회와 사용자 @user를 생성 할 수 있습니다 @ user.role (PARAMS [: ROLE_ID을]) 그래서 사용자를 저장하면 할당 모델의 실패 검증 발생하지 않을 것이라고.

    두 모델, 사용자 및 역할 사이 has_many_through 관계를 가지고, 그리고 validates_presence와 비 존재 또는 잘못된 항목에 대한 연결 모델 할당을 확인하려면 다음 USER_ID : ROLE_ID를, 그것은 유용합니다. 당신은 여전히 ​​그의 협회와 사용자 @user를 생성 할 수 있습니다 @ user.role (PARAMS [: ROLE_ID을]) 그래서 사용자를 저장하면 할당 모델의 실패 검증 발생하지 않을 것이라고.

  8. ==============================

    8.보고 2 개 개의 유용한 자료를 보시기 바랍니다

    보고 2 개 개의 유용한 자료를 보시기 바랍니다

    그리고 inverse_of의 몇 가지 제한 사항을 기억 :

  9. from https://stackoverflow.com/questions/9296694/what-does-inverse-of-do-what-sql-does-it-generate by cc-by-sa and MIT license