24

Railsアプリケーションにモデルがあります-ユーザー。すべてのアソシエーションを、アソシエーションのタイプ(1-1、1-many)とともにRailsコンソールにリストしたいと思います。

4

5 に答える 5

46
User.reflect_on_all_associations

これにより、次のような関連付けの配列が返されます。

#<ActiveRecord::Reflection::AssociationReflection:0x00000105575548 @macro=:has_many, @name=:posts, @options={}, @active_record=User(id: integer, login: string), @collection=false>

サンプルコード:

reflections = User.reflect_on_all_associations
reflections.each do |reflection|
  puts ":#{reflection.macro} => :#{reflection.name}"
end
于 2011-05-04T14:00:57.793 に答える
5

gem pry-railsを使用すると、モデル、その列、および関係にアクセスできるようになります。に含めてからGemfile、を実行しますbundleshow-modelspryコンソールを使用しているときに、このコマンドを使用できます。そして、あなたはあなたのすべてのモデルについての情報を得るでしょう。

show-model (Model_Name)特定のモデルに関する情報を取得するために実行することもできます

于 2016-08-18T21:45:44.700 に答える
1

/libの下にある場所にこれを追加します。たとえば、clone_deep.rbです。

module CloneDeep
  def clone_deep
    kopy = clone
    self.class.reflect_on_all_associations.each do |association|
      next if association.macro == :belongs_to
      cloned_object = case association.macro
                        when :has_many
                          self.send(association.name).collect { |item| item.clone_deep }
                        when :has_one
                          self.send(association.name) && self.send(association.name).clone_deep
                        else
                          clone
                      end
      kopy.send("#{association.name}=", cloned_object)
    end
    return kopy
  end
end

config /initializers/フォルダーの下に新しい初期化子を作成します。このファイルの中に貼り付けます

ActiveRecord::Base.send(:include, CloneDeep)

これで、has_oneとhos_manyのすべての関連付けを使用してモデルのクローンを作成できます。

cloned_person = person.clone_deep
cloned_person.save
于 2013-10-18T14:53:32.673 に答える
0

私は新規ユーザーであるため、他のユーザーの投稿を明確にしたり返信したりすることができません。アソシエーションの変更を確認する前に、レールコンソールをリロードする必要があることに注意してください。

于 2012-09-19T22:58:32.617 に答える
0

これは、特定の場合に実行できます:-user = User.reflect_on_association(:user_profile)およびuser.macro

于 2016-07-13T10:52:40.763 に答える