在我的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
我认为你错误地访问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
self.crawl_link.domain.product_infos
是一个实例的集合,所以你不能在它上面调用实例方法,在你应该使用each
迭代集合或使用map
收集id的每个项目上调用它。要在不创建实例的情况下收集id,您可以使用pluck
:
self.crawl_link.domain.product_infos.pluck(:id_tag)
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