小编Rob*_*ton的帖子

默认情况下使用Vim/Ack搜索整个项目

我想使用Ack(或类似的插件,如果其他东西可以完成这项工作)默认情况下在Vim中搜索我的整个项目,而不仅仅是当前目录.理想情况下,我最终会得到一个像在Sublime中使用Cmd + Shift + F一样的过程.我怎样才能做到这一点?

像CtrlP let g:ctrlp_working_path_mode = 'r'这样的选项使得它在包含文件的最近的父目录中进行搜索.git是完美的.(https://github.com/kien/ctrlp.vim#basic-options)

vim ack

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

一个令人惊讶的复杂的ActiveRecord关系

我有一个User模特.用户有很多EmailAddresses,他们选择其中一个作为他们primary_email_address,这是我发送电子邮件的那个.用户必须始终至少拥有一个电子邮件地址,并且必须设置主电子邮件地址.主电子邮件地址可能会被破坏,但必须为用户分配新的主电子邮件地址.

事实证明这是一个令人惊讶的难以处理的问题,我尝试过的每一个解决方案都有一些令人不满意的因素.这似乎是一个非常普遍的问题(A有很多B,其中一个B是特殊的)所以我很想知道如何彻底解决它.

解决方案1 ​​ - EmailAddress上的布尔列,说明它是否为主要列

就像是:

class User < ActiveRecord::Base
  has_many :email_addresses, inverse_of: :user

  validates :has_exactly_one_primary_email_address

  def primary_email_address
    email_addresses.where(is_primary:true).first
  end

  def has_exactly_one_primary_email_address
    # ...
  end
end

class EmailAddress < ActiveRecord::Base
  belongs_to :user, inverse_of: :email_addresses

  before_destroy :check_not_users_only_email_address
  after_destroy :reassign_user_primary_email_address_if_necessary

  # the logic for both these methods should live on the user but you get the idea
  def reassign_user_primary_email_address_if_necessary
    # ...
  end

  def check_not_users_only_email_address
    # ...
  end
end
Run Code Online (Sandbox Code Playgroud)

这在概念上很尴尬,因为用户只有一个主电子邮件地址非常重要,并且必须在多个电子邮件地址记录中进行验证这看起来很糟糕.虽然我知道ActiveRecord交易应该意味着用户不会在没有主电子邮件地址的情况下陷入困境,但这似乎是灾难的一个秘诀.主电子邮件地址基本上属于用户,将此逻辑放在EmailAddress模型上是不理想的.

解决方案2 - primary_email_adress_id除了user_idEmailAddress …

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

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

GROUP BY包括0,其中不存在

我有一张桌子lists,每张都包含posts.我想要一个查询,告诉我posts每个list有多少,包括每个列表没有任何帖子的0条目.

例如.

posts:

id  |  list_id
--------------
1   |   1  
2   |   1
3   |   2
4   |   2
Run Code Online (Sandbox Code Playgroud)

lists:

id
---
1
2
3
Run Code Online (Sandbox Code Playgroud)

应该返回:

list_id | num_posts
-------------------
1       | 2
2       | 2
3       | 0
Run Code Online (Sandbox Code Playgroud)

我使用以下查询已经这样做了,但是有效地进行分组然后执行另一个子查询来填充空白感觉有点愚蠢:

WITH "count_data" AS (
  SELECT "posts"."list_id" AS "list_id", COUNT(DISTINCT "posts"."id") AS "num_posts"
  FROM "posts"
  INNER JOIN "lists" ON "posts"."list_id" = "lists"."id"
  GROUP BY "posts"."list_id"
)
SELECT "lists"."id", COALESCE("count_data"."num_posts", 0)
FROM …
Run Code Online (Sandbox Code Playgroud)

sql postgresql

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

before_validation,on :: save vs before_save

假设我有一个模型,我可能需要在保存之前操纵它的一些属性:

class User < ActiveRecord::Base

  attr_accessible :name, :email

  # before_validation :set_name_from_email, on: :save
  # OR
  # before_save :set_name_from_email

  def set_name_from_email
    self.name ||= email
  end

end
Run Code Online (Sandbox Code Playgroud)

如果我必须validates :name, presence: true那么当然这将不得不进入before_validation.但是如果有(现在的代码就是这样)回调没有影响对象有效性的可能性,那么把它放进去更好before_save吗?

如果代码发生变化并且回调现在可能影响有效性,那么让所有数据在一个或另一个桶中操纵回调似乎更为简洁,但是当调用类似的东西时再次运行回调似乎很糟糕.valid?.

任何强烈的意见?

activerecord ruby-on-rails

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