Rails ActiveRecord实现关系

时间:2012-10-02 10:11:02

标签: ruby-on-rails activerecord model relationship rails-migrations

帮我解决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

我该如何实现?

3 个答案:

答案 0 :(得分:0)

您需要的是自我参照关联

阅读http://edgeguides.rubyonrails.org/association_basics.html#self-joins并完成 this episode on RailsCasts。这恰恰说明了您的需求。

希望有所帮助

祝你好运。 :)

答案 1 :(得分: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

This rubyonrails guide对此有一个很好的指导。

所以关键是,user对象将有两个方法ownersubordinates。 如果您致电user.owner,则会返回 id 等于 user.owner_id 的用户。
如果您致电user.subordinates,则会返回 owner_id 列中 user.id 的所有用户。

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

现在,如果是迁移脚本,您只需在命名时创建列。

<强>更新

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

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

然后我更新了上面的代码。请看一下它是否有帮助。

答案 2 :(得分:0)

您需要三个表,因为&#34;规则适用于用户&#34;是一个多对多,所以它需要一个连接表。

您还需要重命名用户创建的&#34;规则&#34;或者&#34;规则适用于用户&#34;因为否则你会发生名称冲突。

表:

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