Cara mendapatkan asosiasi rekaman aktif melalui refleksi

Untuk kolom normal, Anda bisa mendapatkannya melalui metode kelas columns. Namun, asosiasi mungkin diberi nama yang sangat berbeda jika opsi foreign_key diatur dalam metode hubungan. Misalnya diberikan

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

jika saya melakukan Post.column_names saya bisa mendapatkan di message_id, tetapi apakah ada cara untuk mendapatkan comments?


person Matt Briggs    schedule 13.11.2010    source sumber


Jawaban (3)


Model.reflections memberikan informasi tentang asosiasi model. Ini adalah kunci Hash pada nama asosiasi. misalnya

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

Berikut ini contoh beberapa informasi yang dapat digunakan untuk mengaksesnya:

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

Catatan: jawaban ini telah diperbarui untuk mencakup Rails 4.2 berdasarkan jawaban MCB dan komentar di bawah. Di versi Rails yang lebih lama, foreign_key refleksi diakses menggunakan primary_key_name sebagai gantinya, dan kunci untuk refleksi mungkin berupa simbol, bukan string, bergantung pada bagaimana asosiasi itu didefinisikan, misalnya. :comments bukannya "comments".

person mikej    schedule 13.11.2010
comment
FYI kawan, refleksi hanya mengembalikan hash, bukan HashWithIndifferentAccess. Jadi kunci dari hash .reflections akan berupa simbol atau string, bergantung pada apa yang tertulis dalam definisi model. Ini hanya membuat saya tersandung karena berpikir itu akan menjadi salah satu atau. - person taelor; 02.04.2012
comment
Seperti yang dikatakan MCB dalam jawabannya, di Rails 4.2, Anda mengatakan Post.reflections["comments"]sebagai gantinya - person Asfand Qazi; 10.04.2015
comment
terima kasih @AsfandYarQazi - Saya telah memperbarui jawaban untuk memasukkan perbedaan untuk Rails 4.2+ - person mikej; 12.04.2015
comment
jawaban Anda membantu saya meningkatkan pengumpulan info tentang database Rails: gist.github.com/r72cccp/3480f4e13f00d54d4cb87bfd4077c8a sebuah - person Sergio Belevskij; 20.08.2016

Untuk Googler masa depan di Rails 4, jawabannya sekarang adalah:

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

Diambil dari sini: https://stackoverflow.com/a/15364743/2167965

Sunting:

reflections, pada 4.2, sekarang menggunakan string, bukan simbol, yang merupakan bug yang menyenangkan untuk dilacak. Jika Anda ingin tetap menggunakan simbol, Anda harus beralih ke reflect_on_association(:assoc_name). Perhatikan juga reflections sebenarnya adalah api publik yang akan terus melaporkan hal-hal seperti HABTM, meskipun itu semua memiliki banyak hal di balik terpal. Refleksi yang sebenarnya digunakan Rails sekarang ada di _reflections

person MCB    schedule 03.01.2014

Untuk objek ActiveRecord saya menggunakan:

object._reflections

Jadi, saya bisa memanipulasi Hash yang dikembalikan. Contohnya:

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

Contoh di atas menghapus semua hubungan dari database.

person Lucivaldo Castro    schedule 09.03.2016
comment
Tidak disarankan untuk menggunakan metode yang digarisbawahi pada Rails, metode tersebut dapat berubah kapan saja tanpa peringatan, yang akan menyebabkan bug saat melakukan upgrade - person camilo.forero; 18.10.2019