小编Cam*_*tin的帖子

ActiveRecord渴望加载多个belongs_to关联

问题

我有以下ActiveRecord模型:

class Person
  belongs_to :favourite_car, class_name: 'Car'
  belongs_to :business_car, class_name: 'Car'
  belongs_to :home_car, class_name: 'Car'
end
Run Code Online (Sandbox Code Playgroud)

当我想访问所有这三个关联时,它会生成三个选择查询:

SELECT * FROM cars WHERE cars.id = ?
Run Code Online (Sandbox Code Playgroud)

这基本上是N + 1问题.

理想情况下,我希望它只生成一个表单查询

SELECT * FROM cars WHERE cars.id IN (?, ?, ?)
Run Code Online (Sandbox Code Playgroud)

可能解决方案

我可以将它移动到has_many :through => :join_table与连接表中的列的关联,以指示关联类型是什么,然后用于includes([:join_table, :cars])急切加载关联.但是,在这种情况下,它只将3个查询减少到2,并引入了一个额外的表.

另一种可能的解决

另一种可能的解决方案是手动加载关联,如下所示:

module EagerLoader
  def eager_load(*associations)
    reflections = associations.map { |association| self.class.reflections[association.to_sym] }
    raise 'Not all are valid associations' if reflections.any?(&:nil?)

    reflections.group_by { |association| association.klass }.each do |klass, …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails eager-loading rails-activerecord

10
推荐指数
2
解决办法
7906
查看次数

带有保留关键字的模型

我想创建一个名为'File'的模型,但它是一个保留的模型名称是rails.我想不出任何其他合理的模型,所以我想知道是否有一个标准的方法来处理这个问题,例如添加前缀或后缀(_File,FileItem等)?

ruby ruby-on-rails

9
推荐指数
1
解决办法
1688
查看次数

如何修改visual studio中的绿色启动按钮?

我有一个C#项目,我在visual studio中编辑.当我单击绿色开始按钮时,它会构建项目,启动IIS,然后打开浏览器窗口.

如果我想自定义此行为,例如还要启动位于IIS前面的nginx反向代理,我该怎么做?

我也有兴趣在点击开始按钮和浏览器窗口打开之间的过程中涉及哪些技术.

c# visual-studio

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

创建Ints和函数列表Int - > Int - > Int

除了创建对列表执行简单操作的函数之外,我对haskell很新.我想创建一个包含类型Int和类型函数的列表Int -> Int -> Int.

这是我尝试过的:

data Token = Value Int | Operator (Int -> Int -> Int)

tokens :: [Token]
tokens = [12, (+)]
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误

Couldn't match expected type `Token'
            with actual type `Integer -> Integer -> Integer'
In the expression: (+)
In the expression: [12, (+)]
In an equation for `tokens': tokens = [12, (+)]
Run Code Online (Sandbox Code Playgroud)

我不确定为什么这不起作用,有人能指出我正确的方向吗?

haskell

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

设置自动边距时,停止flexbox折叠子宽度

我正在使用flexbox创建一个粘性页脚.

body {
    display: flex;
    flex-direction: column;
    min-height: 100vh;
    margin: 0;
}

header, footer {
    background-color: #c9c9c9;
    padding: 20px;
}

main {
    flex: 1;
    margin: 0 auto;
    max-width: 300px;
    border: 1px solid red;
}
Run Code Online (Sandbox Code Playgroud)
<header></header>
<main>This is some content</main>
<footer></footer>
Run Code Online (Sandbox Code Playgroud)

的jsfiddle

这样可以正常工作,但<main>现在宽度会折叠以适应内容,而不是扩展到最大宽度.仅当设置了自动边距时才会发生这种情况.

<main>设置自动边距时,有没有办法扩展到最大宽度?

css flexbox

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

根据以前的元素计算列表的下一个元素

我想定义一个无限列表,其中每个元素都是前面所有元素的函数.

所以,n+1列表的第th个元素是f [x1, x2, ..., xn].

这看起来很简单,但我似乎无法理解如何做到这一点.有人可以帮忙吗?

haskell

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

Rails生成奇怪的mysql查询

我在rails应用程序中使用rack-mini-profiler,当它加载页面时,它有时会显示一些奇怪的查询,例如:

SHOW FULL FIELDS FROM `tablename`
SHOW TABLES LIKE 'tablename'
SHOW CREATE TABLE `tablename`
Run Code Online (Sandbox Code Playgroud)

他们说这些查询来自处理请求的控制器,来自一条线路

@model = Model.first()
Run Code Online (Sandbox Code Playgroud)

这些查询不会在连续的页面加载上执行.

为什么rails会生成这些奇怪的查询?

ruby ruby-on-rails ruby-on-rails-3

4
推荐指数
1
解决办法
1100
查看次数

如何创建一个解析为一个版本的javascript承诺?

我正在使用promises 与faye浏览器客户端一起工作,我有一个函数可以在做异步操作后创建一个faye客户端,如下所示:

function fayeClient() {
  return doSomethingAsychronous().then(function() {
    var faye_client = new Faye.Client('http://localhost/faye');
    return faye_client;
  });
}
Run Code Online (Sandbox Code Playgroud)

我想这样使用它:

fayeClient().then(function(faye_client) {
  // do something with faye_client
});
Run Code Online (Sandbox Code Playgroud)

问题是,faye_client这也是一个可靠的,这意味着通过fayeClient解析返回到faye_client"解析" 的值返回的承诺.但是,我希望承诺直接解决faye_client.

我甚至无法手动将值包装在promise中Promise.resolve(faye_client);,因为使用了相同的promise解析过程.

我认为这可能表明在faye方面滥用了那些人,因为faye_client这并不代表一个尚未知晓的价值.

有没有办法做出一个可以解决价值的承诺?

javascript promise

4
推荐指数
1
解决办法
2083
查看次数

如何在android studio中创建没有主要活动的应用程序?

我正在android studio中创建一个动态壁纸.除了壁纸我不想要任何UI,所以我的应用程序不包含任何活动.

但是,当我尝试部署到设备时,我收到以下错误,我的壁纸将无法加载.

Could not identify launch activity: Default Activity not found
Error while Launching activity
Run Code Online (Sandbox Code Playgroud)

如何创建一个没有主要活动的应用程序?

android live-wallpaper android-activity android-studio

4
推荐指数
1
解决办法
3454
查看次数

将attoparsec解析器转换为解析器,如果它消耗的字节数不是一定长度,则解析器失败

假设我有一个attoparsec解析器,x.

我正在寻找创建一个函数f :: Int -> Parser a -> Parser a,如果y = f n x,然后:

  • y如果x失败则失败
  • y如果x成功x则失败并且不消耗n字节
  • y 否则就会成功

我该怎么做呢?

haskell attoparsec

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