1

この質問は、Ruby on Rails ActiveRecord の関連付けと、それらの移行を生成する方法に関連しています。

ドキュメント/データ管理システム用の Web アプリを構築しようとしていますが、Arg と Descriptor の 2 つのモデルがあります。(記述子を属性ではなくオブジェクトにする理由は、複数の Arg が同じ記述を共有するためです)。Arg と Descriptors の関係は次のとおりです。Arg には 1 つの記述子しかありません。ディスクリプタには多数の引数があります。

基本的に、コードでは、次のことができるようにしたいと考えています。

a1 = Arg.first
a1.descriptor = Descriptor.first
d1 = Descriptor.last
d1.args << Arg.last
d1.args << Arg.first

現在、私はこの設定をしています:

class Descriptor < ActiveRecord::Base
  has_and_belongs_to_many :args
end

class Arg < ActiveRecord::Base
  has_one :descriptor
end

これらの移行も実行しました。

create_table :args do |t|
  t.string :name
  t.timestamps
end

create_table :descriptors do |t|
  t.string :name
  ...
  t.timestamps
end

add_column :descriptors, :switch_id, :integer

create_table :args_descriptors, :id => false do |t|
  t.column :arg_id, :integer, :null => false
  t.column :descriptor_id, :integer, :null => false
end

上記のすべてを試してみると、何らかの理由で 2 つの Args で Descriptor オブジェクトを共有できません。例えば:

>> Arg.first.descriptor
=> nil
>> Arg.first.descriptor = Descriptor.last
=> #<Descriptor id: 9, name: "....
>> Arg.last.descriptor
=> nil
>> Arg.last.descriptor = Descriptor.last
=> #<Descriptor id: 9, name: "....
>> Arg.first.descriptor
=> nil

最初の Arg の記述子が nil になったのはなぜですか?? データベースに列がありませんか? 関係を正しく指定していませんか?

私はレールや移行/データベースにあまり精通していません。概念を説明している場合は、ActiveRecord のコード例と Migrations のコード例の両方を提供してください。ありがとう。

4

2 に答える 2

2

これらは、必要な関連付けと移行であると思います。

class Descriptor < ActiveRecord::Base
  has_many :args
end

class Arg < ActiveRecord::Base
  belongs_to :descriptor
end

create_table :args do |t| 
  t.string  :name 
  t.integer :descriptor_id
  t.timestamps 
end 

create_table :descriptors do |t| 
  t.string :name 
  ... 
  t.timestamps 
end 

Argとの間の関連付けに対して追加情報を保存する場合Descriptorは、 を使用して取得する結合モデルが必要になることに注意してくださいhas_many :through association

于 2010-07-27T08:30:15.840 に答える
0

実際には、これら 2 つのオブジェクトの間に中間テーブルが必要になります。データベースの世界では、これは「マッピング」テーブルと呼ばれます。Ruby では、関連付けを通じて has_many を使用したいと考えています。

http://railscasts.com/episodes/47-two-many-to-many

概念を説明するより良い記事で更新されました。

于 2010-07-27T02:04:31.003 に答える