访问被拒绝,你可能没有权限或未登录。

新手问题 重新问:如果一个表有两个字段要对应 user_id,user 端 association 怎样写?

chairy11 · 2014年09月10日 · 最后由 dddd1919 回复于 2014年09月16日 · 3453 次阅读

问题

比如我有一个表叫“任务”,要标明指派人和负责人,两个都应该对应 user_id

create_table "tasks", force: true do |t|
  t.integer  "assigner_id"
  t.integer  "assignee_id"  
end

现在在 models/task.rb 中这样写

class Task < ActiveRecord::Base
  belongs_to :assigner, class_name: "User", foreign_key: "assigner_id"
  belongs_to :assignee, class_name: "User", foreign_key: "assignee_id"
end

那在 models/user.rb 应该怎样写? 怎样才能区分当一个@user作为 assigner 里的 task,和一个@user作为 assignee 里的 task?怎么提取?@user.task肯定语义模糊了…… 现在想到的是下面的,但总觉得不对劲…觉得 foreign_key: "assigner_id“不应该写在这里,但又怎么区分?

class User < ActiveRecord::Base
  has_many :tasks, foreign_key: "assigner_id"
  has_many :tasks, foreign_key: "assignee_id"
end

看不出有什么问题,再具体点。 可以指定 foreign_key,不知道你说的是不是这个

最好不要叫做"assign_by"及"assign_to", 用人的代称比较好,比如"assigner", "assignee" ,然后分别指定不同的字段名称。

class Task < ActiveRecord::Base
    belongs_to :assigner, foreign_key: :assigner_id, class: "User"
    belongs_to :assignee, foreign_key: :assignee_id, class: "User"
end

大概就是这样吧,语法不保证全部正确。

Task:

has_many :assign_to , :class_name => "User", :inverse_of => :worker
belongs_to :assgn_by, :class_name => "User", :inverse_of => :director

User:

belongs_to :worker,  :class_name => 'Task', :inverse_of => :assign_to
has_mane :director, :class_name => 'Task', :inverse_of => :assign_by

#3 楼 @dddd1919 你这个貌似有点复杂耶……

has_many :assign_to , class_name: "User", inverse_of: :worker
belongs_to :assgn_by, class_name: "User", inverse_of: :director

简单了吧。。。。。

#6 楼 @dddd1919 我是想,我这边没有 worker, director 什么的,角色方面我还没想,反正准备用 rolify 的。 inverse_of: 神马的我看着有点晕…… 回头查查,哈哈,谢谢:)

#1 楼 @loveltyoic #2 楼 @billy #3 楼 @dddd1919 又迷糊了……麻烦能帮忙再解答下吗?

这里foreign_keyinverse_of的用法解释,功能都差不多把

#9 楼 @dddd1919 我之前看了的,

class Customer < ActiveRecord::Base
  has_many :orders, inverse_of: :customer
end

class Order < ActiveRecord::Base
  belongs_to :customer, inverse_of: :orders
end

但从例子上来看,感觉 inverse_of 就是优化下性能,避免数据的不一致性而已。 而 foreign_key 我的理解是,如果对应的字段与 model 名不一样的时候,就加上,比如 customer 字段对应 use 模型……

学习马克

#10 楼 @chairy11 inverse_of也会生成一个自定义的foreign_key,所以可以在 model 间做多次关联

需要 登录 后方可回复, 如果你还没有账号请 注册新账号