我正试图让我的头脑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) 假设我有以下课程
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_supporting和SolarSystem has_many :planets.我想定义我的has_many关系,这样当我询问solar_system所有关联时planets,life_supporting范围会自动应用.基本上,我想solar_system.planets == solar_system.planets.life_supporting.
我不希望改变scope :life_supporting在Planet以
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) 考虑到性能改进,我想知道是否以及哪些索引对连接表有用(特别是在Rails 3 has_and_belongs_to_many上下文中使用).
我的模型是Foo和Bar每个rails惯例,我有一个名为的连接表bars_foos.没有主键或时间戳使老油田在该表bar_id:integer和foo_id:integer.我有兴趣知道以下哪个索引是最好的,没有重复:
add_index :bars_foos, [:bar_id, :foo_id]add_index :bars_foos, :bar_idadd_index :bars_foos, :foo_id基本上,我不确定复合索引是否足够,假设它有助于开始.我相信复合索引可以用作第一项的单个索引,这就是为什么我很确定使用所有三行肯定会导致不必要的重复.
最常见的用法将给出一个模型实例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 …
我想知道如何在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测试?
这可能是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有办法自我引用键.
在我的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方法的类型选项.我假设:模型和:视图会在那里,但其他我完全不确定.我应该使用什么,以便我的请求规范可以通过,并且有一个不同类型的列表:类型?
假设我有一个主题分支,我想重写它的整个历史,因为它最初是从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只有在创建分支并且从当前指向的提交主机创建分支时,两个主服务器都没有高级的情况下才会工作.
是否可以在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) 我正在研究的项目是在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::PredicateBuilder是26号线.仍然不知道哈希是如何empty?在那一点,但也许其他人做.
这是有趣的.我正在调查菲利普的评论,看看为什么他这样做,因为它似乎只是一个澄清,但他是正确的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) activerecord ×2
rspec2 ×2
between ×1
devise ×1
git ×1
github ×1
has-many ×1
helper ×1
indexing ×1
javascript ×1
mysql ×1
rails-i18n ×1
rebase ×1
rspec ×1