2

関係が必ずしも階層的であるとは限らない (つまり、親と子ではなく、友人と同僚) ある個人と別の個人との関係をモデル化したいと考えています。 、 設立日)。最後に、act_as_tree 関係を使用して、これらの関係をナビゲート/図解できるようにしたいと思います。

移行:

class CreateProfiles < ActiveRecord::Migration   def self.up
    create_table :profiles do |table|
      table.column :firstName, :string
      table.column :lastName, :string
      table.column :telephone, :string
      table.column :emailAddress, :string
      table.column :location, :string
      table.timestamps
    end   end   def self.down
    drop_table :profiles   end end

class Relationship < ActiveRecord::Migration   def self.up
    create_table :relationships, :id => false do |table|
      table.column my_id :integer
      table.column your_id :integer
      table.column relationshipType :string
      table.column dateEstablished :date
      table.column notes :text
      table.timestamps      end   end   def self.down
    drop_table :relationships   end end

モデル:

class Person < ActiveRecord::Base
  has_many :relationships, :foreign_key => "my_id"
  has_many :persons :through => :relationships
end

class Relationship < ActiveRecord::Base
  belongs_to :persons
  acts_as_tree
end

質問:

  1. これらのテーブル間の関係を正しく定義するにはどうすればよいですか?
  2. my_id/your_id の組み合わせは一意であるため、リレーションシップ テーブルで :id を削除することは理にかなっていますか?
  3. RoR の規則を利用するための「my_id」および「your_id」フィールドのより適切な名前はありますか?
  4. 列の 1 つが名前 'parent_id' でない場合、act_as_tree 関係で問題が発生しますか?
4

1 に答える 1

2
  1. ほんの数日前に、 「Rails で同じモデルとの多対多の関係はありますか?」</a>という同様の質問がありました。私はそこでループされた関連付けを行う方法を広範囲に文書化しようとしました. おそらくそれはあなたを助けるでしょう?

  2. Rails の ID のないテーブルは、関連付けがある場合にのみ表示されhas_and_belongs_to_manyます。通常has_many :throughの関連付けでは、結合テーブルのモデルは他の ActiveRecord モデルと同様であり、ID 列が必要です

  3. ここでの適切な規則は知りませんが、これらの例は少し奇妙です。としてアクセスすることになりますがrelationship.your、個人的には少し厄介です。おそらくyour_person_id、これは としてアクセスされ、インスタンスrelationship.your_personを扱っていることを明確にしますか? Person別のオプションが考えられますrelationship.you

  4. 私はacts_as_treeを使ったことはありませんが、次のようにパラメーターを指定して呼び出すことができます:acts_as_tree :foreign_key => 'my_id'

他の質問への回答で述べたように、あなたの最大の問題は双方向の関係になるようです。人物 A が人物 B に接続されたからといって、人物 B が人物 A に接続されているとは限りません。残念ながら、ActiveRecord でこれを実現するのは困難です。

于 2010-02-03T14:35:19.577 に答える