【问题标题】:Rails Activerecord querying has_many :throughRails Activerecord 查询 has_many :through
【发布时间】:2012-06-26 05:18:16
【问题描述】:

在 has_many :through 关联中的 Activerecord 查询需要一些帮助。

型号:

工作

class Job < ActiveRecord::Base
  has_many :job_metadata, :dependent => :destroy
  has_many :metadata, :through => :job_metadata

元数据

class Metadatum < ActiveRecord::Base
  attr_accessible :description, :metadata_type_id
  has_one :metadatum_type
  has_many :job_metadata, :dependent => :destroy
  has_many :jobs, :through => :job_metadata

元数据类型

class MetadatumType < ActiveRecord::Base
  attr_accessible :description
  has_many :metada

工作元数据

class JobMetadatum < ActiveRecord::Base
  attr_accessible :job_id, :metadatum_id
  belongs_to :job
  belongs_to :metadatum

在控制台中,我可以运行:

@job.metadata

返回

=> [#<Metadatum id: 2, description: "Part Time", metadatum_type_id: 1, created_at: "2012-06-23 20:42:14", updated_at: "2012-06-23 20:42:14">] 

但是我将如何返回 @jobs.metadata 上具有 metadatum_type_id = 1 的 metadatum_id?

我正在尝试这个:

@job.metadata.metadatum_id.where('metadata.metadatum_type_id' => 1)

但出现以下错误:

NoMethodError:   Metadatum Load (0.3ms)  SELECT "metadata".* FROM 
"metadata" INNER JOIN "job_metadata" ON "metadata"."id" = 
"job_metadata"."metadatum_id" WHERE "job_metadata"."job_id" = 31
undefined method `metadatum_id' 
for #<ActiveRecord::Relation:0x007f7fb3188de8>

【问题讨论】:

  • 关于 has_any :through 最关键的事情是在最初得到正确的模型名称。元数据和元数据非常非英语。我会先想出更好的名字。我从自己的经验中学到了这一点。
  • 谢谢迈克尔。鉴于我正在努力完成的工作,我很乐意为这些模型命名的建议。

标签: ruby-on-rails activerecord


【解决方案1】:

试试这个

@the_metadatum_record = @job.metadata.where("metadatum_type_id = 1").first

这将搜索属于 @job 的 Metadatum 记录,并查看这些记录以找到 metadatum_type_id 为 1 的记录。

然后可以像@the_metadatum_record.id一样访问id

“第一个”被添加到末尾,因为如果您的作业有多个类型 1 的元数据,查询将返回所有这些元数据。

另外,我同意 Michael 的观点,对于表格来说这些名字有点糟糕......

【讨论】:

  • 谢谢。你会推荐什么命名约定。这些表本质上可以存储与不同类型的 Job 相关的数据。希望通过这种架构避免每种数据类型(工作类型、类别、行业等)的大量单独的表关系。但对更好的命名约定持开放态度!
  • 好吧,如果每个工作都有工作类型、类别和行业,我会将所有这些作为列添加到您的工作表中。否则,您可能会制作一个 Detail 模型,甚至是 JobDetail。这样,当您查询元数据记录 ID 之类的内容时,它看起来像 @job.job_details.where("job_detail_type =1")。这种方式更具可读性
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多