0

在 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">] 

但是我将如何返回metadatum_type_id = 1的 @jobs.metadata 上的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>
4

1 回答 1

1

尝试这个

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

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

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

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

另外,我同意迈克尔的观点,这些名字对于桌子来说是很糟糕的......

于 2012-06-25T21:18:16.653 回答