从Scratch标记:查询数据库问题

时间:2012-10-10 13:23:41

标签: ruby-on-rails postgresql tagging acts-as-taggable-on jquery-tokeninput

@saverio成功回答了Tagging from Scratch: the Tag Cloud Issue

上的这个数据库查询问题

现在我正在尝试将标记系统与jQuery-tokenInput连接到创建查找标记,与http://railscasts.com/episodes/258-token-fields-revised一样动态连接。

  • 我的猜测是Posgresql数据库的查询问题。
  • 我已正确安装Postgresql
  • jQuery-tokenInput位于 Application.js //= require jquery.tokeninput
  • 不知怎的,它可以从数据库中已有的标签加载标签,但它无法动态查询下面 pictures.js.coffee 代码中列出的相同单词。

遵循所有相关范围:

pictures.js.coffee

jQuery ->
  $('#picture_tag_tokens').tokenInput '/tags.json'
  theme: 'facebook'
  prePopulate: $('#picture_tag_tokens').data('load')

/views/pictures/_form

<div class="field">
  <%= f.label :tag_tokens, "Tags (separated by commas)" %><br />
  <%= f.text_field :tag_tokens, data: {load: @picture.tags} %>
</div>

这里我的逻辑有点丢失

/models/picture.rb

class Picture < ActiveRecord::Base
  attr_accessible :description, :title, :tag_tokens
  has_many :taggings
  has_many :tags, through: :taggings
  attr_reader :tag_tokens

  #The **below** is the relevant part for the #view/pictures/_form
  def tag_tokens=(tokens)
    self.tag_ids = Tag.ids_from_tokens(tokens)
  end

  def self.tagged_with(name)
    Tag.find_by_name!(name).pictures
  end

  def self.tag_counts
    Tag.select("tags.*, count(taggings.tag_id) as count").
    joins(:taggings).group("tags.id")
  end

  def tag_list
    tags.map(&:name).join(", ")
  end

  def tag_list=(names)
    self.tags = names.split(",").map do |n|
      Tag.where(name: n.strip).first_or_create!
    end
  end
end

下面我可以看出我无法查询数据库

/models/tag.rb

class Tag < ActiveRecord::Base
  attr_accessible :name
  has_many :taggings
  has_many :pictures, through: :taggings

  def self.tokens(query)
    tags = where("name like ?", "%#{query}%")
    if tags.empty?
      [{id: "<<<#{query}>>>", name: "New: \"#{query}\""}]
    else
      tags
    end
  end

  def self.ids_from_tokens(tokens)
    tokens.gsub!(/<<<(.+?)>>>/) { create!(name: $1).id }
    tokens.split(',')
  end
end

我设置我的标签控制器行为的方式也是如此

#controllers/tags_controller.rb

class TagsController < ApplicationController
  def index
   @tags = Tag.all
   respond_to do |format|
     format.html
     format.json { render json: @tags.tokens(params[:q]) }
   end
  end
end

那么,为什么我无法查询Postgresql而我无法动态创建查找

2 个答案:

答案 0 :(得分:1)

我合并了一个非常简单的解决方案:使用Gem ActsAsTaggableOnjQuery Tokeninput

如果你仔细阅读下面的算法,你会发现上面的问题只是对Tag System和jQuery之间配置的误解。以下步骤将帮助您走上正轨:

1将jQuery Tokeninput文件放在正确的位置:

Vendor > assets > javascripts > jquery-tokeninput.js

Vendor > assets > stylesheets > token-input-facebook.css (and 2 others)

{// 1}}中的文件

2在// = require_tree之前的这一行。 这使javascript工作

apps > assets > javascripts > application.js

在* {require_tree之前//= require jquery.tokeninput wright中的文件上有<3>。 这使css工作

apps > assets > stylesheets > application.css.scss

4将*= require token-input-facebook放在gem 'acts-as-taggable-on'上,然后运行捆绑安装,并执行与here完全相同的步骤。

5在gemfile中为标记控制器索引(我们即将定义)创建一个coustom路由以启用json属性

routes.rb

以下代码和以上代码允许我们正确地使用数据库

6运行get '/tag.json', to: 'tag#index', as: :pictures_tags并在此文件上运行以下内容:

  

rails g tag controller index

     

def index

#tag_controller.rb
  

7最后将所有代码粘贴到 query = params[:q] query = query.chomp(" ").downcase @tags = ActsAsTaggableOn::Tag.where("tags.name LIKE '%#{query}%' OR tags.name LIKE '#{query}'") if @tags.empty? ActsAsTaggableOn::Tag.find_or_create_by_name_and_id(id: "#{query}", name: "#{query}") else respond_to do |format| format.html format.json { render json: @tags.collect{ |tag| {id: tag.name, name: tag.name } } } end end

  

app > assets > javascript > your_file_with_tags.js.coffee

     

jQuery - &gt;

#your_file_with_tags.js.coffee

PS:#field_with_tag_list在你的视图中(usualy _form partial),你生成这样的标签就是这样的:(#controller_tag_list),即#pictures_tag_list

$('#field_with_tag_list').tokenInput '/tag.json' theme: 'facebook' prePopulate: $('#field_with_tag_list').data('load') preventDuplicates: true resultsLimit: 3 tokenLimit: 7 tokenDelimiter: "," searchingText: "hit space for New Tag"

<div class="field">

`<%= f.label :tag_list %><br />` `<%= f.text_field :tag_list, data: {load: @picture.tag_list.map {|tag| { id: tag, name: tag }}} %>`

所有这些都是经过实验的代码,我相信它会帮助你=]

答案 1 :(得分:0)

试试你的控制器:

  @tags = Tag.order(:name)

就是这样。