Rails方式:找到与许多where子句的深层嵌套关联

时间:2015-12-16 08:18:09

标签: ruby-on-rails ruby-on-rails-4 activerecord associations rails-activerecord

这似乎是一个简单的问题,但这对我来说有点困惑。我想找到一个好方法来处理这个问题。 我有5个型号。

工作

class Job < ActiveRecord::Base
  has_many :job_entries_jobs
  has_many :job_entries, through: :job_entries_jobs
end

JobEntry

class JobEntry < ActiveRecord::Base
    has_many :attachments
    has_many :job_entries_jobs
    has_many :pinned_entries, through: :job_entries_jobs
    has_many :jobs, through: :job_entries_jobs
    belongs_to :user, class_name: 'User', foreign_key: 'user_id'
end

JobEntriesJob

class JobEntriesJob < ActiveRecord::Base
  self.table_name = 'job_entries_jobs'
  has_many :pinned_entries
  belongs_to :job_entry
  belongs_to :job, touch: true
end

PinnedEntry

class PinnedEntry < ActiveRecord::Base
  self.table_name = "pinned_entries"
  belongs_to :job_entries_job
  has_and_belongs_to_many :users
end

用户

class User < ActiveRecord::Base
  has_many :job_entries
  has_many :pinned_entries
end

我是否可以通过job_id user_id方式request associationsrails来获取pinned_entries(job_id和user_id来自SQL参数)code使用attachment获取pinned_entries。如果是,我应该在哪里放置class Attachment < ActiveRecord::Base self.table_name = 'attachments' belongs_to :job_entry, :class_name => 'JobEntry', :foreign_key => 'job_entry_id' end

如果我有一个include型号

怎么样?
attachment

我想要JobEntry content(链接和文件名)和{ "listPinnedEntries": [ { "id": 1 "user_id": "text": "content of entry", "user": { "id": "username": "jamesnguyen" }, "attachments": [ { "id": "job_entry_id": "comment": "file name", "file": { "url": "link here" } }, { "id": "job_entry_id": "comment": "file name", "file": { "url": "link here" } } ] }] } &&)? 这是应该

的输出
success

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

给定job_iduser_id

user = User.find(user_id)
pinned_entries = user.pinned_entries.includes(:job_entries_job).where(job_entries_jobs: {job_id: job_id})

更新(关于附件的第二个问题):

由于您正在生成值的哈希值,因此修改您的PinnedEntry模型(或者甚至是@Robin回答的Job模型和用户模型)比执行脏循环更容易:

class PinnedEntry < ActiveRecord::Base
  self.table_name = "pinned_entries"
  belongs_to :job_entries_job
  belongs_to :job_entry, through: :job_entries_job
  has_many :attachments, through: :job_entry
  has_and_belongs_to_many :users
end

然后,继续我上面的第一个答案:

pinned_entries.as_json(
  only: [:id, :user_id, :text],
  include: [
    user: {
      only: [:id, :username]
    },
    attachments: {
      only: [:id, :job_entry_id, :comment]
    }
  ]
)

这将返回与您想要的值相同的哈希值。注意:我没有在您的附件模型中添加file: url,没有belongs_to :file或某些内容可以帮助我确定附件模型与file和{{1}的关系}。如果它不是属性,那么我认为您必须手动将这些添加到生成的哈希。

答案 1 :(得分:0)

向模型JobUser添加额外的has_many并通过{{3}将其与PinnedEntry相关联可能是一个好主意。 }}

您的Job模型将更改为:

class Job < ActiveRecord::Base
  has_many :job_entries_jobs
  has_many :job_entries, through: :job_entries_jobs
  has_many :pinned_entries: through: :job_entries
end

然后您可以像往常一样在.pinned_entries记录中使用Job。因此,您更改了User模型。