0

帮助我在 Rails 中进行数据库迁移和模型,我尝试搜索自引用,但我无法做出正面或反面.. 我被卡住了,可以这么说..

基本上我想要两个模型,用户模型和规则模型。

在用户模型中,我想指定用户的所有者,即另一个用户,只能有一个所有者,用户可以是自己的所有者。

还有一个规则模型,我还想在其中指定规则的所有者(用户)(用户可以是许多规则的所有者)和该规则适用的用户(用户)(用户可以有许多规则)。

所以我需要两个迁移和两个模型,我会开始,希望你能理解我正在尝试做的事情..

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

你需要的是自引用关联

阅读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对象将有两个方法ownersubordinates. 如果您调用user.owner,那么它将返回id等于user.owner_id的用户。
如果您调用user.subordinates,那么它将返回在其owner_id列中具有user.id的所有用户。

让我知道是否让它有点复杂:P

现在,在迁移脚本的情况下,您只需创建您命名的列。

更新:

好吧,如果我们只是重新组织您的要求

  • 一个用户可以有许多规则。
  • 许多规则可以应用于一个用户
  • 一个用户可以拥有一个同时也是用户的所有者
  • 一个所有者将有许多下属也是用户。

然后我更新了我上面的代码。现在看看是否有帮助。

于 2012-10-02T10:18:28.960 回答
0

您需要三个表,因为“应用于用户的规则”是多对多的,所以它需要一个连接表。

您还需要重命名“用户创建的规则”或“应用到用户的规则”,否则会出现名称冲突。

表:

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 回答