在我的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
答案 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