帮我解决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
我该如何实现?
答案 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
对象将有两个方法owner
和subordinates
。
如果您致电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