我遇到了某种类型的范围问题,它阻止实例变量被视图调用的助手正确初始化.
#sample_controller.rb
class SampleController < ApplicationController
def test
end
end
#application_controller.rb
helper_method :display
def display
if not defined? @display
return @display = "a"
else
return @display += "a"
end
end
#test.html.erb
<%= display %>
<%= display %>
<%= @display %>
<%= @display.reverse %>
Run Code Online (Sandbox Code Playgroud)
当显示样品/测试时,它会在"评估nil.reverse"时出现错误.这是令人惊讶的,因为显示的前两个调用应该初始化@display我会想到.如果删除<%= @ display.reverse%>,则输出为"a aa",表示辅助方法正在设置@display实例变量,但视图中无法访问它.
如果控制器被修改成为(使用原始视图代码):
class SampleController < ApplicationController
def test
display
end
end
Run Code Online (Sandbox Code Playgroud)
输出变成"aa aaa a a".如果我在控制器中进行2次调用,我会得到"aaa aaaa aa aa".因此,似乎只有在控制器中进行的调用才会修改SampleController实例变量,而视图中的调用将修改视图无法访问的ApplicationController的实例变量.
这是Rails中的错误还是我的误解,这是出于某种原因预期的功能?
我遇到这个bug的上下文是试图创建一个logged_in?ApplicationController方法,在第一次调用时设置@user变量,如果用户登录则返回true或false.除非在尝试在视图中使用它之前在控制器中添加了不必要的调用,否则这将无效.
我正在使用Postgres.
我的数据库中有一个Artices表,其中包含url slugs的列url.这些是我可以在网站上显示该表中的文章而不是" example.com/23323"而是" example.com/Funny_Thing_Happened_to_Me".这很容易实现,然后随着文章数量的增长,我在url slugs上添加了一个索引.
我已经意识到虽然我希望能够在网址中显示大写字母,但我希望它们在用户键入的内容中不区分大小写,并且我希望以不区分大小写的方式强制网址上的唯一性.
是否有一种直接的方式来快速搜索基于文本列的不区分大小写的方式,并以不区分大小写的方式强制执行唯一性?
我尝试用类似的东西进行搜索,lower(url) =但这导致Postgres决定不使用索引.
我是Solr搜索的新手,并试图掌握如何处理结果的排序.我正在使用Ruby on Rails和Sunspot gem来与Solr进行交互.
我有一个文章模型,其中包含以下被索引的字段:
text Title
text AuthorNames
integer NumberOfReviews
Run Code Online (Sandbox Code Playgroud)
我希望能够在Solr上搜索:
理想情况下,我还希望能够做一些像谷歌那里有惊无险和错别字也被发现在一定程度上,和替换的搜索建议是当它看起来像用户可能已经犯了一个错误,虽然我不确定这是可能的.
任何人都可以帮助或指出我正确的方向吗?提前致谢!
我有一个简单的jQuery函数来调整文本区域的大小,我希望它适用于所有文本区域.
在大多数情况下,这很有效:
$(document.ready(function(){$("text_area").resizer('250px')});
Run Code Online (Sandbox Code Playgroud)
但是,因为它只在文档准备就绪时调用一次,所以它无法捕获稍后使用Ajax添加到页面上的文本区域.我查看了.live()函数,它看起来非常接近我正在寻找的东西.但是,.live()必须绑定到特定事件,而我只需要在它们完成加载时触发一次(onLoad事件对单个元素不起作用).
我唯一可以工作的是将JavaScript调用直接包含在Ajax中.这是推荐的方式吗?
编辑:以下是它为Ajax请求所做的操作的rails源代码:
$('a[data-confirm], a[data-method], a[data-remote]').live('click.rails', function(e) {
var link = $(this);
if (!allowAction(link)) return false;
if (link.attr('data-remote') != undefined) {
handleRemote(link);
return false;
} else if (link.attr('data-method')) {
handleMethod(link);
return false;
}
});
// Submits "remote" forms and links with ajax
function handleRemote(element) {
var method, url, data,
dataType = element.attr('data-type') || ($.ajaxSettings && $.ajaxSettings.dataType);
if (element.is('form')) {
method = element.attr('method');
url = element.attr('action');
data = element.serializeArray();
// memoized value from clicked submit button
var button …Run Code Online (Sandbox Code Playgroud) 我有一个模型,我正在尝试从中检索数据数组,我不需要将数据实例化为Ruby对象.实际上,这只是在我的代码中引入了一个额外的步骤来逐步执行对象并生成一个只包含我需要的数据的新数组.
例:
class Book
#has attribute in database title
end
Run Code Online (Sandbox Code Playgroud)
我想生成一个数组,其中包含数据库中所有书籍的所有标题.最好的方法是什么?
我正通过Heroku在Postgres上运行Rails应用程序.
我想在我的网站上实现类似Facebook"喜欢"的各种项目,例如用户评论.将这些存储在我的数据库中的最有效和快速的最聪明的方法是什么?
显而易见的是在用户和项目之间有一个类似的连接表,如下所示:
user_id int
item_id int
item_type string
created_at datettime
Run Code Online (Sandbox Code Playgroud)
但是,当显示时,这意味着每次我拉一个项目时,我都必须在整个相似的表中拉一个连接,这可能会变得非常大.
对此的明显反应是在项目中存储计数器,用于持续计数.但是,这不起作用,因为谁喜欢一个项目很重要,既可以显示在项目旁边,也可以隐藏用户已经喜欢的东西的类似按钮.
我的计划是在所有可爱的项目中添加一个文本字段,我将在其中存储一个序列化数组.这样,项目的每一次拉动都会附上谁喜欢它的完整列表.有没有更好的方法来做到这一点,还是这是推荐的方法?
我在Postgres中有一张桌子,上面满是文章。文章具有与之相关联的url标记,用于显示它们,example.com/pretty_name而不是example.com\2343。
不幸的是,当我刚开始的时候,我对URL实施了唯一的约束,但是却忽略了对大小写不敏感的限制,因此我想纠正这个错误,并开始要求URL不区分大小写。
作为第一步,我需要修复数据库中已经存在的所有重复URL。如何在不区分大小写的基础上在表中搜索具有重复url的行,并保留原样的行,而对于其余重复项,在末尾附加类似“ _2”的内容?
这特别棘手,因为我不是100%肯定没有重复重复的网址。即,我可能在一个URL上有3个重复项,在理想情况下,我希望第一个为URL,pretty_name第二个为URL,pretty_name_2第三个为URL pretty_name_3。
这可能是一个愚蠢的问题,但看到EC2和S3之间的转移只要在同一区域内是免费的,为什么不能通过EC2流式传输所有转移和从S3转移并完全免费转移?
具体来说,我正在研究Heroku,这是一个在EC2上运行的Ruby on Rails托管服务,带宽是免费的.他们已经解决了上传问题,特别注意如果通过Heroku流式传输这些内容是免费的.但是,我想知道为什么相同的技巧不会反过来,所以请求的任何文件都通过EC2流传输?
如果可能的话,难以设置吗?我似乎无法在Google上找到任何关于此概念的讨论.
我的控制器中有以下代码:
@items = Item.where(:user_id => 1).order("updated_at DESC").limit(2)
@oldest_item = @items.last
Run Code Online (Sandbox Code Playgroud)
出于某种原因,我猜这与我最近升级到Rails 3有关,@ oldest_item没有被设置为@items中的最后一项,而是设置为匹配的最后一项Item.where(:user_id => 1).order("updated_at DESC").
所以想象有3个匹配的项目,A,B和C. @items被设置为[A,B],然后@oldest_item被设置为C.
奇怪的是,当我@items.last从我的视野中打电话时,它正确地返回B.
当我从控制器中将两行粘贴到控制台时,它也正确地返回B.
有人可以向我解释这里到底发生了什么事吗?
在有goto的语言中,我喜欢在函数末尾创建一个错误块(返回之后),然后当我在函数中进行错误检查时,我可以简洁并转到每个检查中的错误处理程序.据我了解,这是goto的一个有效用途,不被认为是不好的做法.
伪代码示例:
def example
if (x) goto error
do something
if (y) goto error
do something
If (z) goto error
do something
return
label 'error'
log "error occurred"
begin
redirect_to :back
rescue
redirect_to root_url
end
return;
end
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,在这种情况下,我的错误块与函数本身一样长,重复3次会使代码大小翻倍,而且不会很干.然而,似乎Ruby不支持goto,或者至少如果它支持goto,就像我从谷歌上看到的那样最好,它可能是某种可能被称为邪恶的笑话库.
因此,人们在Ruby中做什么来处理重复的错误检查,在每个错误中应该发生相同的结果?
想象一下像模特这样的用户谁拥有很多朋友,每个人都有很多评论,我试图向用户显示他的朋友最新的100条评论.
是否有可能在单个SQL查询中绘制最新的100,或者我将不得不使用Ruby应用程序逻辑来解析更大的列表或进行多个查询?
我看到了两种解决方法:
编辑:我很难让EmFi的解决方案工作,并且会欣赏任何人都可以提供的任何见解.
好友是通过联接表的循环关联.
has_many :friendships
has_many :friends,
:through => :friendships,
:conditions => "status = #{Friendship::FULL}"
Run Code Online (Sandbox Code Playgroud)
这是我在相关部分得到的错误:
错误:列users.user_id不存在
: SELECT "comments".* FROM "comments" INNER JOIN "users" ON "comments".user_id = "users".id WHERE (("users".user_id = 1) AND ((status = 2)))
Run Code Online (Sandbox Code Playgroud)
当我刚进入user.friends,它工作时,这是它执行的查询:
: SELECT "users".* FROM "users" INNER JOIN "friendships" ON "users".id = "friendships".friend_id WHERE (("friendships".user_id = 1) AND ((status = 2)))
Run Code Online (Sandbox Code Playgroud)
因此,似乎它正在破坏:通过在一个查询中有两个:through.
我正在使用一些模型,其中许多给定模型的关键属性实际存储在子模型中.
例:
class WikiArticle
has_many :revisions
has_one :current_revision, :class_name => "Revision", :order => "created_at DESC"
end
class Revision
has_one :wiki_article
end
Run Code Online (Sandbox Code Playgroud)
Revision类有很多数据库字段,WikiArticle很少.但是,我经常需要从WikiArticle的上下文访问Revision的字段.最重要的情况可能是创建一篇文章.我一直在这样做,有很多看起来像这样的方法,每个领域一个:
def description
if @description
@description
elsif current_revision
current_revision.description
else
""
end
end
def description=(string)
@description = string
end
Run Code Online (Sandbox Code Playgroud)
然后在我的保存中,我将@description保存到新版本中.
这一切都让我想起了很多attr_accessor,只是看起来我不能让attr_accessor去做我需要的东西.我如何定义一个attr_submodel_accessor,这样我就可以给出字段名称并让它像attr_accessor一样自动创建所有这些方法?
我相关部分的数据库模式是有一个名为User的表,它有一个布尔字段Admin.此字段Admin上有一个索引.
前一天我将完整的生产数据库恢复到我的开发机器上,然后对数据库进行了非常小的更改,因此它们应该非常相似.
当我在我的开发机器上运行以下命令时,我得到了预期的结果:
EXPLAIN SELECT * FROM user WHERE admin IS TRUE;
Index Scan using index_user_on_admin on user (cost=0.00..9.14 rows=165 width=3658)
Index Cond: (admin = true)
Filter: (admin IS TRUE)
Run Code Online (Sandbox Code Playgroud)
但是,当我在生产机器上运行完全相同的命令时,我得到了这个:
Seq Scan on user (cost=0.00..620794.93 rows=4966489 width=3871)
Filter: (admin IS TRUE)
Run Code Online (Sandbox Code Playgroud)
因此,它不是使用与查询完美匹配的精确索引,而是使用近500万行的顺序扫描!
然后我试图运行EXPLAIN ANALYZE SELECT * FROM user WHERE admin IS TRUE;,希望ANALYZE能使Postgres意识到500万行的顺序扫描不如使用索引那么好,但这并没有改变任何东西.
我还尝试运行REINDEX INDEX index_user_on_admin,以防索引被破坏,没有任何好处.
最后,我打来电话,VACUUM ANALYZE user并在短时间内解决了问题.
我对真空的主要理解是它用于回收浪费的空间.可能发生的事情会导致我的指数行为异常严重,为什么真空修复呢?
postgresql ×4
database ×3
search ×2
sql ×2
activerecord ×1
ajax ×1
amazon-ec2 ×1
amazon-s3 ×1
duplicates ×1
find ×1
goto ×1
helper ×1
heroku ×1
instance ×1
javascript ×1
join ×1
jquery ×1
lucene ×1
ruby ×1
solr ×1
sunspot ×1
unique ×1
variables ×1
view ×1
vote ×1