리플렉션을 통해 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
'programing' 카테고리의 다른 글
Clojure에서 부두 서버를 어떻게 중지합니까? (0) | 2021.01.19 |
---|---|
마우스 오버시 툴팁이나 아이템 정보를 어떻게 표시합니까? (0) | 2021.01.19 |
exec가 하위 기능이있는 함수에서 작동하지 않는 이유는 무엇입니까? (0) | 2021.01.19 |
URL에서 더하기 (+) 기호를 인코딩하는 방법 (0) | 2021.01.19 |
테스트를위한 공용 SAML v2 서비스 제공 업체? (0) | 2021.01.19 |