@saverioは、最初からのタグ付けに関するこのデータベースクエリの質問に答えることに成功しました:タグクラウドの問題
現在、タグ付けシステムを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をクエリできず、動的に作成または検索できないのですか?