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

MetadatumType

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

JobMetadatum

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 に答える