Rails 5 - 根据关键模型上的键和值的任意哈希构建AR查询

时间:2017-01-13 08:22:13

标签: ruby-on-rails ruby activerecord hash ruby-on-rails-5

我需要解析网址并存储唯一的网页。感谢像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!这里希望有更优雅的东西。

0 个答案:

没有答案