小编And*_*rew的帖子

方法定义的Ruby钩子?

我一直在谷歌搜索这个并且找不到答案,这让我觉得答案是否定的,但我想我会在这里问,以防有人确切知道.

Ruby是否有定义方法的钩子(即在模块或类上)?

如果没有,是否有人熟悉该main对象的实现,以便知道Object在顶层定义方法时它是如何复制的?

真的好奇这个.谢谢你的任何信息:)

ruby

7
推荐指数
1
解决办法
363
查看次数

Rails 3 HABTM通过记录关联模型属性查找

我认为这是非常基本的,但我对SQL很可怕,所以我不知道怎么做...

我在两个模型LandUse和Photo之间有一个标准的HABTM关系.所以我有一个land_uses_photos连接表,每个模型都有标准宏,如:

Photo
has_and_belongs_to_many :land_uses
Run Code Online (Sandbox Code Playgroud)

土地使用表具有:ID和名称(字符串).

我想找到Land Use Name ='foo','bar'或'baz'的照片.我怎么做?

我看了这个问题并试了一下:

Photo.includes(:land_uses).where('land_use.id'=>[6,7])
Run Code Online (Sandbox Code Playgroud)

......但那给了我:

ActiveRecord::StatementInvalid: No attribute named `id` exists for table `land_use`
Run Code Online (Sandbox Code Playgroud)

这是假的,这是LandUse和连接表的schema.rb:

create_table "land_uses", :force => true do |t|
  t.string   "name"
  t.datetime "created_at"
  t.datetime "updated_at"
  t.integer  "display_order"
end

create_table "land_uses_photos", :id => false, :force => true do |t|
  t.integer "land_use_id"
  t.integer "photo_id"
end
Run Code Online (Sandbox Code Playgroud)

那么,我该怎么做呢?并且只使一个问题而不是两个问题,我怎么能找到一个"和"条件而不是一个"或"条件?

谢谢!

sql ruby-on-rails has-and-belongs-to-many ruby-on-rails-3

6
推荐指数
1
解决办法
2528
查看次数

Ruby:Case使用对象

有没有办法隐式调用case语句的对象上的方法?IE:

class Foo

  def bar
    1
  end

  def baz
    ...
  end

end
Run Code Online (Sandbox Code Playgroud)

我希望能做的就是这样......

foo = Foo.new
case foo
when .bar==1 then "something"
when .bar==2 then "something else"
when .baz==3 then "another thing"
end
Run Code Online (Sandbox Code Playgroud)

...其中"when"语句正在评估case对象上方法的返回.这样的结构有可能吗?如果是这样的话,我一直无法弄清楚语法......

ruby case object

6
推荐指数
3
解决办法
2387
查看次数

Rails 3.1:从Lib导入Sass

我有一堆'bootstrap'sass文件,我想/lib按照资产管道的新约定粘在我的应用程序目录中.

但是,我需要将这些导入到我application.css.scss而不是要求它们,因为我想在整个应用程序中共享一些颜色变量等.我无法找到@import从中获取.scss文件的方法/lib/assets/stylesheets.

有什么建议?

ruby-on-rails sass ruby-on-rails-3.1 asset-pipeline

6
推荐指数
2
解决办法
3641
查看次数

使用Minitest,需要'minitest_helper'加载错误

我正在测试Minitest :: Spec作为RSpec的替代品,但我有一个麻烦的问题我无法找到答案:

我已经设置了一些基本规格spec/models/*_spec.rb.我的rails应用程序包括minitest-rails,我已经设置了我的rakefile如下:

Rake::TestTask.new do |t|
  t.libs.push "lib"
  t.test_files = FileList['spec/**/*_spec.rb']
  t.verbose = true
end
task :default => :test
Run Code Online (Sandbox Code Playgroud)

现在,如果我像这样编写我的spec文件:

require 'minitest_helper'

describe User do
  ...
end
Run Code Online (Sandbox Code Playgroud)

...然后跑rake test,我得到:

user_spec.rb:1:in `require': cannot load such file -- minitest_helper (LoadError)
Run Code Online (Sandbox Code Playgroud)

但是,如果我将需求行更改为

require_relative '../minitest_helper'
Run Code Online (Sandbox Code Playgroud)

然后它工作.所以,这是功能性的,但似乎每个使用我在网上找到的最小规格的人的例子都让他们只是打电话require 'minitest_helper',而不是require_relative.那么,我错过了什么让那些为别人工作但不在我的情况下呢?

最后一条信息,我的帮助文件如下所示:

# spec/minitest_helper.rb
ENV["RAILS_ENV"] = "test"
require File.expand_path('../../config/environment', __FILE__)

require "minitest/autorun"
require "minitest/rails"

# Uncomment if you want Capybara in accceptance/integration tests
# require "minitest/rails/capybara"

# …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails minitest

6
推荐指数
1
解决办法
3509
查看次数

将ActiveRecord habtm查询转换为Arel

我有一个非常普遍的habtm关系:

Photo has_and_belongs_to_many :tags
Tag has_and_belongs_to_many :photos
Run Code Online (Sandbox Code Playgroud)

在我的Photo模型中,我有一个"带标签"的方法,我用它来查找用一组给定的tag_ids标记的照片.此查询只需匹配具有所有给定标记的照片,但无需考虑是否存在任何其他标记.这是我的方法:

def self.with_terms( array )
  select('distinct photos.*').joins(:tags).where('tags.id' => array).group("photos." + self.column_names.join(', photos.')).having("count(*) = #{array.size}")
end
Run Code Online (Sandbox Code Playgroud)

这按预期工作.

现在,为了更好地与我正在使用的其他库集成,我需要在Arel中重写它.(让它成为Arel节点?,不确定你通常称之为什么).

我一直在尝试这个,但说实话我以前从未尝试过使用过Arel,所以我有点失落.我一直在试验控制台并尝试:

t = Photo.arel_table
q = t.join(:tags).on(t[:tags_id].in(array))
Photo.where(q)
Run Code Online (Sandbox Code Playgroud)

但是,(1)我认为q首先不是正确的查询,并且(2)它创建了一个Arel::SelectManager,当传递给调用的地方时Cannot visit Arel::SelectManager.所以,显然我做错了.

更新:只是为了在这里特别具体,我希望返回一个Arel节点,因为我正在使用一个gem(ransack),希望你传递它的搜索方法的Arel节点.Ransack将此Arel节点与其他节点链接在一起,以生成复杂的搜索查询.

Arel大师可以告诉我这是怎么做的吗?

activerecord ruby-on-rails arel

6
推荐指数
1
解决办法
2223
查看次数

Rails:如何测试before_save回调

给定一个典型的ActiveRecord模型,我经常会有before_save回调来解析输入,例如time_string从用户处获取类似内容并将其解析为time字段.

该设置可能如下所示:

before_save :parse_time
attr_writer :time_string

private
def parse_time
  time = Chronic.parse(time_string) if time_string
end
Run Code Online (Sandbox Code Playgroud)

我知道将回调方法设为私有是最佳做法.但是,如果它们是私有的,那么你不能单独调用它们来单独测试它们.

那么,对于那些经验丰富的Rails测试人员来说,你如何处理测试这种事情?

testing ruby-on-rails private-members

6
推荐指数
2
解决办法
2400
查看次数

是否可以从Thor脚本中调用Git或其他命令行工具?

我发现在为我的Rails 3应用程序进行git提交之前和之后,我经常运行一系列例行的"清理"任务.

我正在考虑将这些东西放入Thor脚本,但有一点我无法弄清楚是如何使用Thor(或Rake)来调用系统上的其他工具.

是否可以git log通过Thor或Rake脚本调用命令,如果是这样,那是什么样的?

谢谢!

ruby git rake ruby-on-rails thor

5
推荐指数
1
解决办法
2779
查看次数

Ruby:来自对象数组中的一个值的新数组

请原谅我,如果已经被问过,我找不到它.

我有一个对象数组,如:

[<#Folder id:1, name:'Foo', display_order: 1>,
<#Folder id:1, name:'Bar', display_order: 2>,
<#Folder id:1, name:'Baz', display_order: 3>]
Run Code Online (Sandbox Code Playgroud)

我想将该数组转换为名称数组,例如:

['Foo','Bar','Baz']
Run Code Online (Sandbox Code Playgroud)

而且,当我在它的时候,如果我可以使用相同的技术从两个参数创建一个数组,即名称和显示顺序如下:

[['Foo',1],['Bar',2],['Baz',3]]
Run Code Online (Sandbox Code Playgroud)

做这种事的最好的'Ruby Way'是什么?

谢谢!

ruby arrays object

5
推荐指数
1
解决办法
6412
查看次数

Ruby:数组,循环数组,数组位置中的next/previous值

假设我有一系列随机数,没有特定的顺序.假设这些是在马拉松比赛中跑步的人的ID#,他们按照他们完成的顺序添加到阵列中,例如:

race1 = [8, 102, 67, 58, 91, 16, 27]
race2 = [51, 31, 7, 15, 99, 58, 22]
Run Code Online (Sandbox Code Playgroud)

这是一个简化的,有点人为的例子,但我认为它传达了基本的想法.

现在有几个问题:

首先,我如何获得特定条目之前和之后的ID?让我们说我正在看第58跑,我想知道谁在他之前和之后完成.

race1, runner58: previous finisher=67, next finisher=91
race2, runner58: previous finisher=99, next finisher=22
Run Code Online (Sandbox Code Playgroud)

其次,如果我正在看第一个或最后一个完成的人,我怎么能在阵列周围回到"下一个"或"前一个"循环?

race1, runner8: previous finisher=27, next finisher=102
race2, runner22: previous finisher=58, next finisher=51
Run Code Online (Sandbox Code Playgroud)

最后,我想展示每个跑步者完成的位置.只考虑数组及其中的值,我怎样才能找出它在数组中的"序数"位置?即:

race1: runner8=1st, runner102=2nd, runner67=3rd ... runner27=last
Run Code Online (Sandbox Code Playgroud)

非常感谢!

ruby arrays

5
推荐指数
2
解决办法
1万
查看次数