【问题标题】:Rails ActiveRecord implementing relationshipRails ActiveRecord 实现关系
【发布时间】:2012-10-02 10:11:02
【问题描述】:

帮助我在 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

我该如何实现?

【问题讨论】:

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


    【解决方案1】:

    你需要的是自引用关联

    阅读http://edgeguides.rubyonrails.org/association_basics.html#self-joins 并通过 this episode on RailsCasts。这准确地展示了您正在寻找的内容。

    希望对你有帮助

    祝你好运。 :)

    【讨论】:

      【解决方案2】:

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

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

      表格:

      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
        

      【讨论】:

        【解决方案3】:
        #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

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

        更新:

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

        • 一个用户可以有多个规则。
        • 许多规则可以应用于一个用户
        • 一个用户可以有一个所有者,他也是一个用户
        • 一个所有者将有许多下属也是用户。

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

        【讨论】:

        • 那么规则模型呢?我要这样写吗? belongs_to :for, :class_name -&gt; 'User', :foreign_key =&gt; 'user_id'belongs_to :user 它引用用户两次.. 作为所有者和(规则)我还需要手动(在迁移中)创建这些字段吗?
        • "owner of rule" 是规则的一个属性(所以是belongs_to)但是一个规则可以应用到很多用户,一个用户可以应用很多规则,所以这是完全不同的事情.
        • 如果你写belongs_to :user,它会自动派生类名为Userforeign_key为'user_id'。但在belongs_to :owner 的情况下,我们必须指定类名,因为派生类名将是“所有者”。
        猜你喜欢
        • 2015-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多