0

Railsでのデータベース移行とモデルを手伝ってください。自己参照などを検索してみましたが、頭も尻尾も作れません..つまり、行き詰まっています..

基本的に User モデルと Rule モデルの 2 つのモデルが必要です。

ユーザーモデルで、別のユーザーであるユーザーの所有者を指定したいのですが、所有者は1人だけで、ユーザーはそれ自体の所有者になることができます。

そして、ルールの所有者 (ユーザー) (ユーザーは多くのルールの所有者になることができます) とこのルールが適用されるユーザー (ユーザー) (ユーザーは多くのルールを持つことができます) も指定したいルール モデル。

したがって、2 つの移行と 2 つのモデルが必要です。開始します。うまくいけば、私がやろうとしていることを理解していただけると思います..

class User < ActiveRecord::Base
  belongs_to :user #?
  has_one :user    # as in owner
  has_many :rules  # rules for given user and rules that are created by this user
  ... #and some more similar entries
end

class Rule < ActiveRecord::Base
  belongs_to :user # as in owner of rule and rule for user
end

そして、移行に何を書くべきかまったくわかりません..

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :username

      #owner?

      #stuff left out
      t.timestamps
    end
  end
end

class CreateRules < ActiveRecord::Migration
  def change
    create_table :rules do |t|
      t.string :title

      #rule for?
      #owner?

      #stuff left out
      t.timestamps
    end
  end
end

これを実装するにはどうすればよいですか?

4

3 に答える 3

0

「ユーザーに適用されるルール」は多対多であるため、結合テーブルが必要なため、3 つのテーブルが必要です。

また、「ユーザーによって作成されたルール」または「ユーザーに適用されるルール」のいずれかの名前を変更する必要があります。そうしないと、名前の競合が発生するためです。

テーブル:

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      #stuff left out

      t.references :owner

      #stuff left out
    end
  end
end

class CreateRules < ActiveRecord::Migration
  def change
    create_table :rules do |t|
      #stuff left out

      t.references :owner

      #stuff left out
    end
  end
end

class CreateRulesUsers < ActiveRecord::Migration
  def change
    create_table :rules_users do |t|
      t.references :user
      t.references :rule
    end
  end
end

モデル

  • ユーザー

    has_many :owned_users, :class_name => "User", :foreign_key => "owner_id", :inverse_of => :owner
    belongs_to :owner, :class_name => "User", :foreign_key => "owner_id", :inverse_of => :owned_users
    has_and_belongs_to_many :rules # uses the join table
    has_many :owned_rules, :class_name => "Rule", :foreign_key => "owner_id", :inverse_of => :owner
    
  • ルール

    belongs_to :owner, :class_name => "User", :foreign_key => "owner_id", :inverse_of => :owned_rules
    has_and_belongs_to_many :users # uses the join table, it's the users to which the rule applies
    
于 2012-10-02T10:25:09.550 に答える
0

必要なのは自己参照関連です

http://edgeguides.rubyonrails.org/association_basics.html#self-joinsを 読んで、RailsCasts に関するこのエピソードを読んでください。これは、探しているものを正確に示しています。

それが役に立てば幸い

幸運を。:)

于 2012-10-02T10:16:02.937 に答える
0
#Models/user.rb
class User < ActiveRecord::Base
  belongs_to :owner, :class_name => 'User', :foreign_key => 'owner_id'
  has_many :subordinates, :class_name => 'User'
  has_many :rules, :through => "owner_rules"
end

#Models/OwnerRule.rb
class OwnerRule < ActiveRecord::Base
    belongs_to :users
    belongs_to :rules
end

#Models/Rule.rb
class Rule < ActiveRecord::Base
    has_many :users, :through => "owner_rules"
end

この ruby​​onrails ガイドには、これに関する適切なガイドラインがあります。

ポイントは、userオブジェクトには と の 2 つのメソッドがownerあるということsubordinatesです。呼び出すと、 idがuser.owner_idに等しいuser.ownerユーザーが返されます。 呼び出すと、owner_id列にuser.idを持つすべてのユーザーが返されます。
user.subordinates

少し複雑になったかどうか教えてください:P

ここで、移行スクリプトの場合は、名前を付けて列を作成するだけです。

アップデート:

あなたの要件を再編成するだけなら

  • ユーザーは多くのルールを持つことができます。
  • 1 人のユーザーに多くのルールを適用できます
  • 1 人のユーザーは、ユーザーでもある所有者を持つことができます
  • 1 人の所有者には、ユーザーでもある多くの部下がいます。

次に、上記のコードを更新しました。すぐに役立つ場合は、ご覧ください。

于 2012-10-02T10:18:28.960 に答える