如何在带有单独外键的rails模型中使用

时间:2015-11-12 18:46:56

标签: ruby-on-rails activerecord associations

我有一个带有以下型号的rails应用程序。我希望能够直接从任务中引用配置文件。我认为我应该使用:通过某种方式,但我无法弄清楚。现在让我们说如果我想获得任务模型中的first_name,我必须使用task.executor.profile.first_name。而不是我想使用task.executor_profile.first_name。

我需要它来进行搜索,你可以参考与include的关联。如果有一个更简单的解决方案,而不必通过关联,请告诉我。

更新:

基于@ rlarcombe,我尝试了委托,但遗憾的是Ransack似乎并没有支持这种解决方案,但它与rails配合得很好。可以告诉我如何在这种情况下使用:through关联?

user.rb

has_many :assigned_tasks, class_name: "Task", foreign_key: "assigner_id", dependent: :destroy
has_many :executed_tasks, class_name: "Task", foreign_key: "executor_id", dependent: :destroy
has_one :profile, dependent: :destroy

profile.rb

belongs_to :user

task.rb

belongs_to :assigner, class_name: "User"
belongs_to :executor, class_name: "User"

1 个答案:

答案 0 :(得分:1)

您所要做的就是在任务模型上定义几个has_one through associations

这些关联定义可以为您提供所需内容:

应用/模型/ task.rb

class Task < ActiveRecord::Base
  belongs_to :assigner, class_name: "User"
  belongs_to :executor, class_name: "User"

  has_one :assigner_profile, through: :assigner, source: :profile
  has_one :executor_profile, through: :executor, source: :profile
end

应用/模型/ user.rb

class User < ActiveRecord::Base

  has_many :assigned_tasks, class_name: "Task", foreign_key: "assigner_id", dependent: :destroy
  has_many :executed_tasks, class_name: "Task", foreign_key: "executor_id", dependent: :destroy
  has_one :profile, dependent: :destroy

end

应用/模型/ profile.rb

class Profile < ActiveRecord::Base
  belongs_to :user
end

有了这些,您现在应该可以致电:

task.assigner_profile.first_name

task.executor_profile.first_name

这些has_one通过关联应该与Ransack一起正常工作。

由于