小编Aar*_*ron的帖子

inverse_of做什么?它产生什么SQL?

我正试图让我的头脑inverse_of,我不明白.

生成的sql是什么样的,如果有的话?

inverse_of如果与,和一起使用:has_many,该选项是否表现出相同的行为?:belongs_to:has_many_and_belongs_to

对不起,如果这是一个基本问题.

我看到了这个例子:

class Player < ActiveRecord::Base
  has_many :cards, :inverse_of => :player
end

class Card < ActiveRecord::Base
  belongs_to :player, :inverse_of => :cards
end
Run Code Online (Sandbox Code Playgroud)

activerecord ruby-on-rails

133
推荐指数
5
解决办法
4万
查看次数

默认情况下,在Rails has_many关系上使用范围

假设我有以下课程

class SolarSystem < ActiveRecord::Base
  has_many :planets
end

class Planet < ActiveRecord::Base
  scope :life_supporting, where('distance_from_sun > ?', 5).order('diameter ASC')
end
Run Code Online (Sandbox Code Playgroud)

Planet有范围life_supportingSolarSystem has_many :planets.我想定义我的has_many关系,这样当我询问solar_system所有关联时planets,life_supporting范围会自动应用.基本上,我想solar_system.planets == solar_system.planets.life_supporting.

要求

  • 希望改变scope :life_supportingPlanet

    default_scope where('distance_from_sun > ?', 5).order('diameter ASC')

  • 我还想通过不必添加来防止重复 SolarSystem

    has_many :planets, :conditions => ['distance_from_sun > ?', 5], :order => 'diameter ASC'

目标

我想要有类似的东西

has_many :planets, :with_scope => :life_supporting

编辑:解决问题

正如@phoet所说,使用ActiveRecord可能无法实现默认范围.但是,我发现了两个潜在的工作.两者都可以防止重复.第一个是长期保持明显的可读性和透明度,第二个是助手类型方法,其输出是显式的.

class SolarSystem < ActiveRecord::Base …
Run Code Online (Sandbox Code Playgroud)

activerecord has-many ruby-on-rails-3

74
推荐指数
2
解决办法
4万
查看次数

我如何才能看到我正在github上观看的所有项目?

有没有办法看到我正在观看的所有项目的列表,也许可以放大一些?

github

50
推荐指数
2
解决办法
7595
查看次数

连接表的最佳SQL索引

考虑到性能改进,我想知道是否以及哪些索引对连接表有用(特别是在Rails 3 has_and_belongs_to_many上下文中使用).

模型和表设置

我的模型是FooBar每个rails惯例,我有一个名为的连接表bars_foos.没有主键或时间戳使老油田在该表bar_id:integerfoo_id:integer.我有兴趣知道以下哪个索引是最好的,没有重复:

  1. 复合指数: add_index :bars_foos, [:bar_id, :foo_id]
    • 两个指标
    • 一个. add_index :bars_foos, :bar_id
    • B. add_index :bars_foos, :foo_id
  2. 1和2-B的组合

基本上,我不确定复合索引是否足够,假设它有助于开始.我相信复合索引可以用作第一项的单个索引,这就是为什么我确定使用所有三行肯定会导致不必要的重复.

可能的用法

最常见的用法将给出一个模型实例Foo,我将要求bars使用RoR语法关联它foo.bars,反之亦然,bar.foos用于模型的实例Bar.

这些将产生的类型的查询SELECT * FROM bars_foos WHERE foo_id = ?SELECT * FROM bars_foos WHERE bar_id = ?分别然后使用这些所得ID来SELECT * FROM bars WHERE ID in (?)SELECT * FROM foos WHERE ID in …

indexing database-design ruby-on-rails rails-migrations

38
推荐指数
2
解决办法
8945
查看次数

如何在rails 3中将find_each存根到rspec测试中

我想知道如何在rspec中测试find_each调用.我习惯于简单地存在我希望模型返回的内容,所以我不依赖于db中的测试数据,如下所示:

MyClass.stub(:find).and_return(my_mock)
Run Code Online (Sandbox Code Playgroud)

但是,在另一个班级我这样做:

MyClass.find_each do |instance_of_my_class|
  do_stuff_here_on(instance_of_my_class)
end
Run Code Online (Sandbox Code Playgroud)

我发现如果我这样做:

MyClass.stub(:find_each).and_return([one_mock, two_mock])
Run Code Online (Sandbox Code Playgroud)

在规范测试中,"在这里做东西"部分没有被执行.有谁知道如何存储find_each进行rspec测试?

rspec ruby-on-rails rspec2

36
推荐指数
1
解决办法
8333
查看次数

在I18n插值中使用另一个I18n键

这可能是I18n-ception,但我可以说我有一个en.yml文件如下

en:
  my_var: Foo
  my_message: "This is a message where I'd like to interpolate I18n's %{my_var}"
Run Code Online (Sandbox Code Playgroud)

有没有办法向I18n表明%{my_var}应该是my_var关键en.yml

我知道我可以通过做类似的事情来实现它

I18n.t 'my_message', :my_var => I18n.t('my_var')
Run Code Online (Sandbox Code Playgroud)

但我希望I18n有办法自我引用键.

interpolation ruby-on-rails internationalization rails-i18n

29
推荐指数
2
解决办法
4805
查看次数

Rspec 2 config:类型类型

在我的spec_helper.rb中,我有

config.include Devise::TestHelpers, :type => :controller
Run Code Online (Sandbox Code Playgroud)

这样我就可以实际测试需要用户进行身份验证的控制器.但是,请求中同一类的规范也需要登录,否则测试将失败.我试过了

config.include Devise::TestHelpers, :type => :request
Run Code Online (Sandbox Code Playgroud)

但这也不起作用.我似乎无法找到我可以传递给rspec include或extend方法的类型选项.我假设:模型和:视图会在那里,但其他我完全不确定.我应该使用什么,以便我的请求规范可以通过,并且有一个不同类型的列表:类型?

configuration helper devise rspec2

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

一个分支的交互式变基,其与主人的分歧点

假设我有一个主题分支,我想重写它的整个历史,因为它最初是从master为pull请求创建的.无论出于何种原因,使用git log确定我想传递给的提交哈希并不容易或明显

git rebase -i <commit>
Run Code Online (Sandbox Code Playgroud)

我知道我可以git merge-base <branch1> <branch2 || master>用来查找两个引用可以跟踪其祖先的提交,并可以使用它来确定提交.我想知道的是,如果有一种更好的方式来交互式地改变整个分支(无论主人是否提高)而不是使用

git rebase -i `git merge-base my_branch master`
Run Code Online (Sandbox Code Playgroud)

编辑:我不想更改在此分支上进行的第一次提交的父级,因此git rebase -i master只有在创建分支并且从当前指向的提交主机创建分支时,两个主服务器都没有高级的情况下才会工作.

git rebase

21
推荐指数
2
解决办法
6094
查看次数

是否可以在JavaScript构造函数中构造实例/成员变量?

是否可以在JavaScript类的构造函数中使用解构赋值来分配实例变量,类似于如何对常规变量执行此操作?

以下示例有效:

var options = {one: 1, two: 2};
var {one, two} = options;
console.log(one) //=> 1
console.log(two) //=> 2
Run Code Online (Sandbox Code Playgroud)

但我不能得到类似以下的东西:

class Foo {
  constructor(options) {
    {this.one, this.two} = options;
    // This doesn't parse correctly and wrapping in parentheses doesn't help
  }
}

var foo = new Foo({one: 1, two: 2});
console.log(foo.one) //=> I want this to output 1
console.log(foo.two) //=> I want this to output 2
Run Code Online (Sandbox Code Playgroud)

javascript destructuring variable-assignment

19
推荐指数
1
解决办法
1889
查看次数

为什么Rails使用带有范围的where子句哈希语法向查询添加"OR 1 = 0"?

我正在研究的项目是在RDS上使用MySQL(特别是mysql2 gem).

当我在where语句中使用包含范围的条件的哈希时,我的查询有点奇怪.

User.where(id: [1..5])
Run Code Online (Sandbox Code Playgroud)

User.where(id: [1...5])
Run Code Online (Sandbox Code Playgroud)

分别导致以下查询:

SELECT `users`.* FROM `users` WHERE ((`users`.`id` BETWEEN 1 AND 5 OR 1=0))
SELECT `users`.* FROM `users` WHERE ((`users`.`id` >= 1 AND `users`.`id` < 5 OR 1=0))
Run Code Online (Sandbox Code Playgroud)

查询工作完全正常,因为OR FALSE实际上是无操作.我只是想知道为什么Rails或ARel将这个片段添加到查询中.

编辑

看起来可以解释这一点的线ActiveRecord::PredicateBuilder26号线.仍然不知道哈希是如何empty?在那一点,但也许其他人做.

编辑2

这是有趣的.我正在调查菲利普的评论,看看为什么他这样做,因为它似乎只是一个澄清,但他是正确的1..5 != [1..5].前者是1到5的包含范围,后者是第一个元素前者的数组.我尝试将这些放入ARel where调用,以查看生成的SQL,但OR 1=0不存在!

User.where(id: 1..5) #=> SELECT "users".* FROM "users"  WHERE ("users"."id" BETWEEN 1 AND 5)
User.where(id: 1...5) …
Run Code Online (Sandbox Code Playgroud)

mysql ruby-on-rails between

18
推荐指数
1
解决办法
2921
查看次数