[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.문서에서, 그것은 것 같다 : 옵션을 생성하지, 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.내 생각 : 당신이 아직 지속되지 않은 단체와 함께 작업 할 때 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.이 홍보 후 (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.모두 그냥 업데이트 - 우리는 단지 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.우리가 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.이 문서를 살펴 보자!
이 문서를 살펴 보자!
http://gsusmonzon.blogspot.com.br/2011/09/rails-power-of-inverseof.html
-
==============================
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.보고 2 개 개의 유용한 자료를 보시기 바랍니다
보고 2 개 개의 유용한 자료를 보시기 바랍니다
그리고 inverse_of의 몇 가지 제한 사항을 기억 :
from https://stackoverflow.com/questions/9296694/what-does-inverse-of-do-what-sql-does-it-generate by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 루비 온 레일 및 유증에 여러 사용자 모델은 별도의 등록 경로하지만 하나 개의 공통 로그인 경로가합니다 (0) | 2020.02.09 |
---|---|
[RUBY-ON-RAILS] 어떻게 루비 또는 레일이있는 URL에서 URL 매개 변수를 추출하는? (0) | 2020.02.09 |
[RUBY-ON-RAILS] 어떻게 루비 배열에서 평균을 만들려면 어떻게해야합니까? (0) | 2020.02.09 |
[RUBY-ON-RAILS] LINK_TO에 쿼리 문자열 매개 변수를 추가 (0) | 2020.02.09 |
[RUBY-ON-RAILS] 세션 현재의 관행을 레일 (0) | 2020.02.09 |