ActiveRecord_Associations_CollectionProxy的未定义方法'id_tag'

时间:2016-07-21 11:27:54

标签: ruby-on-rails ruby database activerecord rails-activerecord

在我的CrawlProduct类中,我想从表ProductInfo中获取id_tag:

class CrawlProduct < ActiveRecord::Base
    belongs_to :crawl_link

    css_id = self.crawl_link.domain.product_infos.id_tag
end

CrawlProducts有一个外键crawl_link,表CrawlLinks有一个外键domain当然来自表Domain。而ProductInfo属于域名。

class CrawlProduct < ActiveRecord::Base
        belongs_to :crawl_link 
end   

class CrawlLink < ActiveRecord::Base
        belongs_to :domain
        has_one :crawl_product
end

class Domain < ActiveRecord::Base
        has_many :crawl_links
        has_many :product_infos
end

class ProductInfo < ActiveRecord::Base
        belongs_to :domain
end

但最后,我总是收到以下错误:

undefined method `id_tag' for #<ProductInfo::ActiveRecord_Associations_CollectionProxy:0x0055d72e423640>

如何访问id_tag?据我所知,没有专栏缺失。

编辑:在答案之后,我收到了不同的错误。

NameError: undefined local variable or method `id_tag' for #<CrawlProduct:0x0055d72fcd9fe0>

我不知道为什么我会遇到这个问题。以下是我创建id_tag的方法:

class Domain < ActiveRecord::Base
   domain = Domain.create(domain: 'https://www.example.com')
   product_info = ProductInfo.create(domain: domain, id_tag: 'some content')
end

3 个答案:

答案 0 :(得分:1)

self.crawl_link.domain.product_infos是实例的集合,因此您无法在其上调用实例方法,在每个项目上调用它,您应该使用each迭代集合或使用{{1}收集ID }。要在不创建实例的情况下收集ID,您可以使用map

pluck

答案 1 :(得分:1)

self.crawl_link.domain.product_infos 会返回一组对象,因此您无法从集合中检索id_tag(字段)。

相反,你可以使用,。

class CrawlProduct < ActiveRecord::Base
    belongs_to :crawl_link

    def some_action
      css_ids = self.crawl_link.domain.product_infos.pluck(:id_tag)

      (or)

      css_ids = self.crawl_link.domain.product_infos.map(&:id_tag)
    end
end

答案 2 :(得分:1)

我认为您错误地访问了product_infos。您需要指定所需的那个,然后从中访问id_tag。

Rails正确告诉你

undefined method `id_tag' for #<ProductInfo::ActiveRecord_Associations_CollectionProxy:0x0055d72e423640>

因为这段关系是has_many。

如果你想只访问数据库中的第一个(没有特定的顺序,除非你指定),你可以这样做

css_id = self.crawl_link.domain.product_infos.first.id_tag