我需要解析网址并存储唯一的网页。感谢像Youtube这样基于查询参数(而不仅仅是在URI路径部分)构建独特页面的网站,我需要区分完整网址,而不仅仅是路径部分。 (我现在忽略片段部分,我不认为这对我的应用程序有用)
以下是我正在使用的数据示例
{
"url": "https://www.youtube.com/watch?v=0jExdUIc49s?&ab_channel=PokerStaples",
"decoded": {
"scheme": "https",
"host": {
"prefix": "www",
"suffix": "youtube.com"
},
"path": "watch",
"queries": [
{
"query": "v",
"value": "0jExdUIc49s?"
},
{
"query": "ab_channel",
"value": "PokerStaples"
}
]
},
}
第1步
构建这样的查询,但基于提供的URL中的查询动态。
p = Page.joins(:page_queries)
.where(path: 'watch', domain: @domain)
.where(page_queries: {query: 'v', value: '0jExdUIc49s?'})
.first_or_create
PageQueries正如您所期望的那样,Page has_many PageQueries(属性page_id,query,value)
我认为我通过创建哈希来接近,但显然我错过了一些东西:
pq = { 'v':'0jExdUIc49s?' }
p = Page.joins(:page_queries)
.where(path: 'watch', domain: @domain)
.where(page_queries: pq)
.first_or_create
这是输出:
p = Page.joins(:page_queries).where(路径:'watch',domain: @domain).where(page_queries:pq)页面加载(1.4ms)SELECT “pages”。* FROM“pages”INNER JOIN“page_queries”ON “page_queries”。“page_id”=“pages”。“id”WHERE“pages”。“path”=?和 “pages”。“domain_id”= 162 AND“page_queries”。“v”=? [[“路径”, “看”,[“v”,“0jExdUIc49s?”]]
ActiveRecord :: StatementInvalid:SQLite3 :: SQLException:没有这样的列: page_queries.v:SELECT“pages”。* FROM“pages”INNER JOIN “page_queries”ON“page_queries”。“page_id”=“pages”。“id”WHERE “pages”。“path”=? AND“pages”。“domain_id”= 162 AND “page_queries”。“v”=?
任何想法?
我几个小时来一直在反对这个问题。非常感谢您的帮助。
第2步
每个Domain记录还有has_many Discriminators--那些区分独特结果的查询。 (IE,utm_查询用于跟踪,在此应用程序中没有用)。我们在找到需要查询值来定义唯一页面的域时添加这些内容。
对于我们一直在使用的YouTube,“v”是重要参数,但在我的测试中,我添加了第二个。
我将它们拉成阵列:
@domain.discriminators.pluck(:query)
[
[0] "v",
[1] "test"
]
..然后目标是使用“鉴别器”和提供的查询的合并来创建和使用具有有用类别的唯一页面记录。
我还没有这么远,但是一旦我越过第一步,我认为这不会是一个大问题。
谢谢!
每个请求 - 基本架构&关系
Domain
has_many :pages
has_many :discriminators
t.string "suffix"
t.string "prefix"
t.string "connection"
Discriminator
belongs_to :domain
t.string "query"
t.integer "domain_id"
Page
belongs_to :domain
has_many :page_queries
t.string "path"
t.integer "domain_id"
PageQuery
belongs_to :page
t.string "query"
t.string "value"
t.integer "page_id"
现在,(几乎)解决我的问题的危险方式!我真的希望有人可以拿出一些忍者Ruby来拯救我这个命运。 (我不是在写这个作为答案,因为我不能在良心上称之为答案。这是一个小问题。)
@url = "https://www.youtube.com/watch?v=0jExdUIc49s?&ab_channel=PokerStaples"
uri = URI(@url)
@queries = uri.query.split('&')
@pq = {}
@queries.each do |q|
k = q.split('=').first
v = q.split('=').last
@pq.store(k.to_sym, v)
end
@request = "Page.joins(:page_queries).where(path: 'watch', domain: @domain)"
@pq.each {|q, v| @request << ".where(page_queries: {query: '#{q}', value:'#{v}'})"}
eval(@request)
的fugly!这里希望有更优雅的东西。