ActiveRecord_Associations_CollectionProxy的未定义方法'id_tag'

问题描述 投票:0回答:3

在我的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
ruby-on-rails ruby database activerecord rails-activerecord
3个回答
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

1
投票

self.crawl_link.domain.product_infos是一个实例的集合,所以你不能在它上面调用实例方法,在你应该使用each迭代集合或使用map收集id的每个项目上调用它。要在不创建实例的情况下收集id,您可以使用pluck

self.crawl_link.domain.product_infos.pluck(:id_tag)

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
© www.soinside.com 2019 - 2024. All rights reserved.