小编b73*_*b73的帖子

has_many:通过counter_cache

我的理解是,在定义:counter_cache选项时,它将在包含belongs_to声明的模型上指定.因此,当使用has_may通过关联时,我有点不确定如何处理这个问题(因为我认为在这种情况下不使用belongs_to声明):

class Physician < ActiveRecord::Base
  has_many :appointments
  has_many :patients, :through => :appointments
end

class Appointment < ActiveRecord::Base
  belongs_to :physician, :counter_cache => appointment_count
end

class Patient < ActiveRecord::Base
end
Run Code Online (Sandbox Code Playgroud)

我希望使用:counter_cache选项来更有效地查找属于医生的患者数量.

myPhysician.patients.count
Run Code Online (Sandbox Code Playgroud)

仅供参考:Rails 3.1

干杯

ruby ruby-on-rails

20
推荐指数
2
解决办法
8829
查看次数

如何模拟提供者

我的Angular 1.3应用程序正在使用angular-translate库.在我的Karma测试中,我试图$translate用我创建的Mock对象来模拟提供者.

调用模拟对象MockTranslate,它属于myMocks模块.我没有MockTranslate在问题中包含来源,因为它与问题无关.

我测试的主题是一个控制器,我可以很容易地$translate使用以下模拟:

module('myMocks');
inject(function($controller, MockTranslate) {                                                                                              
  $controller("MyController", {                                                                                                           
    $translate: MockTranslate.create(translations);                                                                                        
  });                                                                                                                                      
});
Run Code Online (Sandbox Code Playgroud)

上面的模拟工作,但我倾向于使用angular.mock.module类似的东西来模拟提供者:

module('myMocks');
module("myModule", function($provide) {                                                                                                    
  $provide.provider("$translate", function(MockTranslate) {                                                                              
    return MockTranslate.create(translations);                                                                                      
  });                                                                                                                                      
});
Run Code Online (Sandbox Code Playgroud)

但是当我运行测试时出现以下错误:

Error: [$injector:modulerr] Failed to instantiate module function ($provide) due to: Error: [$injector:unpr] Unknown provider: MockTranslate

如何使用模拟提供程序angular.mock.module

unit-testing jasmine angularjs karma-runner karma-jasmine

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

默认情况下订阅了什么nix通道

几周前我在我的机器上安装了nix软件包管理器(macOS 10.12.6 Sierra).

我想更新mylocal nixpkgs集合,使其与频道中的任何上游更新同步.我的理解是,这可以通过运行:nix-channel --update.但是当我运行它时,我得到以下输出:

unpacking channels... created 0 symlinks in user environment

建议我的系统订阅的频道中没有更新任何表达式.如果我跑,nix-channel --list我没有看到列出的任何频道.默认情况下我的系统订阅了哪个频道?我应该期望它被列出吗?

nix-channel --update如果我修改了我订阅的频道或者我订阅了不稳定的频道,通常只会产生局部变化吗?

nixos nix

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

ActiveModel :: Serializer :: CollectionSerializer

我正在使用Active Model Serializers v0.10.0.rc4

我想产生看起来像这样的json:

{
  "posts": [
    { "post": {"id": 2, "name": "foo"} },
    { "post": {"id": 3, "name": "bar"} }
  ],
  "next_page": 3
}
Run Code Online (Sandbox Code Playgroud)

我知道基本的:

render json: posts, each_serializer: PostSerializer
Run Code Online (Sandbox Code Playgroud)

将产生这样的json:

[
  {"id": 2, "name": "foo"}
  {"id": 3, "name": "bar"}
]
Run Code Online (Sandbox Code Playgroud)

我尝试了以下操作:

控制器:

render json: posts, serializer: PostsSerializer
Run Code Online (Sandbox Code Playgroud)

posts_serializer:

class PostsSerializer < ActiveModel::Serializer
  attributes :posts, :next_page

  def posts
    ActiveModel::Serializer::CollectionSerializer.new(object,
      each_serializer: PostSerializer,
      root: "post"
    )
  end

  def next_page
    3 
  end
end
Run Code Online (Sandbox Code Playgroud)

但这会产生如下的json:

{
  "posts": [
    {
      "object": {"id": 2, …
Run Code Online (Sandbox Code Playgroud)

ruby active-model-serializers ruby-on-rails-4

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

安装到 nix-shell 中时 Aspell 字典丢失

当我在 Mac OSX 上使用 Nix 将带有英语 Aspell 字典的 Aspell 包安装到我的全局环境中时:

$ nix-env -iA nixpkgs.aspell nixpkgs.aspellDicts.en
Run Code Online (Sandbox Code Playgroud)

然后 Aspell 的行为正如我所期望的:

$ aspell dump dicts

en
en-variant_0
...
Run Code Online (Sandbox Code Playgroud)

但是,如果我将软件包安装到 nix-shell 中,则词典似乎未正确安装:

$ nix-shell -p aspell aspellDicts.en --pure

$ aspell dump dicts
# nothing printed

$ echo 'word lister to check' | aspell --list
Error: No word lists can be found for the language "en_US".
Run Code Online (Sandbox Code Playgroud)

以下每个变体都会产生相同的问题行为:

  • 安装到不纯的 nix-shell 中,
  • 将 nix 表达式放入 default.nix 文件中并运行nix-shell
  • 安装其他 Aspell 词典

谁能建议如何让它发挥作用?

nixos nix

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

编写本地 nix 包

我想运行一个安装了以下软件包的 nix-shell:

  • 阿斯佩尔
  • aspellDicts.en
  • 你好

我不能简单地做:nix-shell -p aspell aspellDicts.en hello --pure因为这将无法正确安装 aspell 词典。Nix 提供了一个aspellWithDict函数,可用于使用字典构建 aspell:

nix-build -E 'with import <nixpkgs> {}; aspellWithDicts (d: [d.en])'
Run Code Online (Sandbox Code Playgroud)

我想将此构建的结果用作另一个本地包 (foo) 中的依赖项。这就是我目前实现这一目标的方式:

./pkgs/aspell-with-dicts/default.nix:

with import <nixpkgs> {};

aspellWithDicts (d: [d.en])
Run Code Online (Sandbox Code Playgroud)

./pkgs/foo/default.nix:

{stdenv, aspellWithDicts, hello}:

stdenv.mkDerivation rec {
    name = "foo";
    buildInputs = [ aspellWithDicts hello ];
}
Run Code Online (Sandbox Code Playgroud)

./custom-packages.nix:

{ system ? builtins.currentSystem }:

let
  pkgs = import <nixpkgs> { inherit system; };

in

rec {
  aspellWithDicts = import ./pkgs/aspell-with-dicts;

  foo = …
Run Code Online (Sandbox Code Playgroud)

nixos nix

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