programing

리플렉션을 통해 activerecord 연결을 얻는 방법

projobs 2021. 1. 19. 20:42
반응형

리플렉션을 통해 activerecord 연결을 얻는 방법


일반 컬럼의 경우 columns클래스 메소드 를 통해 얻을 수 있습니다 . 그러나 foreign_key관계 방법에 옵션이 설정되어있는 경우 연관 이름이 상당히 다를 수 있습니다 . 예를 들어, 주어진

class Post
  has_many :comments, :foreign_key => :message_id # this is a contrived example
end

내가했다면 Post.column_names얻을 수 message_id있지만 얻을 방법이 comments있습니까?


Model.reflections모델의 연관성에 대한 정보를 제공합니다. 그것은됩니다 Hash협회 이름에 키가. 예 :

Post.reflections.keys # => ["comments"]

다음은 액세스에 사용할 수있는 몇 가지 정보의 예입니다.

Post.reflections["comments"].table_name # => "comments"
Post.reflections["comments"].macro # => :has_many
Post.reflections["comments"].foreign_key # => "message_id"

참고 : 이 답변은 MCB 의 답변과 아래 설명을 기반으로 Rails 4.2를 다루도록 업데이트되었습니다 . 레일 이전 버전의 반사의를 foreign_key사용하여 액세스 한 primary_key_name대신과 반사에 대한 키는 협회가 예를 들어 정의 된 방법에 따라 문자 대신 문자열이 될 수 있습니다 :comments대신 "comments".


Rails 4의 미래 Google 직원에게 답은 다음과 같습니다.

Post.reflections[:comments].foreign_key # => "message_id"

여기에서 가져온 것 : https://stackoverflow.com/a/15364743/2167965

편집하다:

reflections, 4.2부터는 이제 추적하는 재미있는 버그 인 기호 대신 문자열을 사용합니다. 기호를 계속 사용하려면로 전환해야합니다 reflect_on_association(:assoc_name). 또한 reflections실제로 공개 API 는 HABTM과 같은 것을 계속보고 할 것입니다. 비록 그것이 모두 내부적으로 많은 것을 가지고 있더라도 말입니다. Rails가 실제로 사용하는 리플렉션은 이제_reflections


ActiveRecord 개체의 경우 다음을 사용합니다.

object._reflections

따라서 반환 된 해시를 조작 할 수 있습니다. 예를 들면 :

object._reflections.keys.each do |key|
    object.public_send(key).destroy_all
end

위의 예는 데이터베이스에서 모든 관계를 삭제합니다.

참조 URL : https://stackoverflow.com/questions/4173333/how-to-get-activerecord-associations-via-reflection

반응형