小编pie*_*ard的帖子

Rails - 抽象类定义和文件命名的最佳实践

我想定义3个类:

  • a MotherClass(摘要,无法推断)
  • a SubClassA(继承自MotherClass)
  • a SubClassB(继承自MotherClass)

在Rails中声明它的最佳解决方案是什么?

1.将所有内容放入app/models /

  • MotherClass < AR::Base 在app/models/mother_class.rb中
  • SubClassA < MotherClass 在app_models/sub_class_a.rb中
  • SubClassB < MotherClass 在app/models/sub_class_b.rb中

优点:实施起来并不复杂

不方便:模型文件夹中的大混乱

2.为两个子类创建一个模块

  • MotherClass < AR::Base 在app/models/mother_class.rb中
  • MotherModule::SubClassA < MotherClass 在app/models/mother_module/sub_class_a.rb中
  • MotherModule::SubClassB < MotherClass 在app/models/mother_module/sub_class_b.rb中

优点:与解决方案1相同

不方便:命名MotherModuleMotherClass使用不同的名称,但它们的意思几乎相同

3.为3个类创建一个模块

  • MotherModule::Base < AR::Base 在app/models/mother_module/base.rb中
  • MotherModule::SubClassA < MotherModule::Base 在app/models/mother_module/sub_class_a.rb中
  • MotherModule::SubClassB < MotherModule::Base 在app/models/mother_module/sub_class_b.rb中

优点:非常干净

不方便:需要一些函数Base来覆盖(例如table_name)


所以我的问题是:Rails中的最佳实践是什么? - 如何命名我的课程? - 他们的目录是什么?

abstract-class model ruby-on-rails

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

显示复选框列表而不是多个选择

我有一个MyModel带有序列化属性的模型a,描述了一个符号数组.

此代码有效:

<% form_for @my_model do |f| %>
  <%= f.select :a, MyModel::AS, :multiple => true) %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

参数是正确的:

{ :my_model => { :a => [:a_value1, :a_value2] } }
Run Code Online (Sandbox Code Playgroud)

我想将这个多选项转换为一组复选框,如下所示:

<% form_for @my_model do |f| %>
  <% MyModel::AS.each do |a_value|
    <%= f.check_box(:a_value) %>
  <% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

它也有效,但参数完全不同:

{ :my_model => { :a_value1 => 1, :a_value2 => 1 } }
Run Code Online (Sandbox Code Playgroud)

我想到2个解决方案可以回归到第一个解决方案......

  • 将我check_box转换为check_box_tag,替换多个选择,并在check_box_tags上的用户clic时添加一些javascript以"检查"选择值.然后,参数将直接在控制器中相同.
  • 在控制器中添加一个小代码,以"适应"我的参数.

什么解决方案不那么难看?或者还有其他的吗?

ruby-on-rails ruby-on-rails-2

11
推荐指数
2
解决办法
3万
查看次数

ElasticSearch - 返回查询的facet的完整值

我最近开始使用ElasticSearch.我尝试完成一些用例.其中一个我有问题.

我用一些用户的全名索引了一些用户(例如"Jean-Paul Gautier","Jean De La Fontaine").

我试图让所有的全名响应一些查询.

例如,我希望100个最常用的全名由"J"开始

{
  "query": {
    "query_string" : { "query": "full_name:J*" } }
  },
  "facets":{
    "name":{
      "terms":{
        "field": "full_name",
        "size":100
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我得到的结果是全名:"Jean","Paul","Gautier","De","La","Fontaine".

如何获得"Jean-Paul Gautier"和"Jean De La Fontaine"(所有full_name值由'J'乞讨)?"post_filter"选项不是这样做的,它只限制上面这个子集.

  • 我必须配置这个full_name方面的"如何工作"
  • 我必须为当前查询添加一些选项
  • 我必须做一些"映射"(目前非常模糊)

谢谢

lucene elasticsearch

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

Rspec - 检查数组是否具有与其他元素相同的元素,无论顺序如何

我不确定它是否是一个Rspec问题,但我只是在Rspec测试中加入了这个问题.

我想检查数组是否等于另一个数组,无论元素顺序如何:

[:b, :a, :c] =?= [:a, :b, :c]
Run Code Online (Sandbox Code Playgroud)

我目前的版本:

my_array.length.should == 3
my_array.should include(:a)
my_array.should include(:b)
my_array.should include(:c)
Run Code Online (Sandbox Code Playgroud)

在Rspec,ruby或Rails上是否有任何方法可以执行以下操作:

my_array.should have_same_elements_than([:a, :b, :c])
Run Code Online (Sandbox Code Playgroud)

问候

ruby rspec ruby-on-rails ruby-on-rails-2

7
推荐指数
3
解决办法
9003
查看次数

重用多个Rails模型中的方法

初学者ruby/rails问题在这里.我有一个方法,我目前在我的"用户"模型中使用.

def generate_token(column) begin self[column] = SecureRandom.urlsafe_base64 end while User.exists?(column => self[column]) end

我想在不同的模型中重用相同的方法,比如说我的帐户模型.

在这个模型之间共享这样的代码的好地方在哪里?另外,为了获得调用类,我只使用"self.class"?

谢谢

ruby ruby-on-rails

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

Rails 4 - 如果条件不适用范围

我想创建一个具有某些条件的范围,其中一个返回不是特定范围.目前,此解决方案有效:

scope :my_scope, ->(my_var) {
  scope = where('TRUE')
  if my_var.condition1?
     scope = scope.where({ :some_condition => :some_value })
  end
  if my_var.condition2?
     scope = scope.where({ :some_condition => :some_value })
  end
  scope 
}
Run Code Online (Sandbox Code Playgroud)

还有其他更好的解决方案吗?

问候

scope ruby-on-rails ruby-on-rails-4

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

Symfony/doctrine:优化 n+1 查询

语境

想象一组提案,其中每个用户都可以对提案投赞成票或反对票。

所以我有2个模型:

  • Proposal
  • A Vote,与 a proposal、 auser和 an opinion(向上或向下)相关。

现在我想显示我的所有提案,包括每个提案的额外信息:

  • 多少赞?
  • 投了多少票?
  • 当前用户是否已投票?
  • 当前用户是否已投反对票?

 问题

这真的很容易实现,但这意味着每个提案显示 4 个请求(称为 n+1 查询问题)。我来自 Rails 世界,在那里可以使用预先加载或一些棘手的查询轻松解决此问题。但是我无法用教义解决它,需要一些帮助!

我试过的

 使用魔法领域

第一种解决方案是进行自定义查询:选择所有提案,包括赞成票、反对票的数量,当前用户是否赞成或反对。

查询现在返回4分列比模型来描述:count_upvotescount_downvoteshas_user_upvotedhas_user_downvoted

为了与学说一起使用,我必须将这些字段添加到我的Proposal实体中。

对我来说,这不是一个好的解决方案,因为它意味着始终使用此查询来避免混蛋模型,其中这些字段可以为空。

使用摘要

第二种解决方案是让视图使用另一个对象。这个对象是用一个参数创建的:当前用户。该对象由优化查询创建,包含以下方法:

  • getAllProposals()
  • getUpvotes($a_proposal)
  • getDownvotes($a_proposal)
  • hasUserUpvoted($a_proposal)
  • hasUserDownvoted($a_proposal)

对我来说,仅仅为了视图优化而被迫创建一个对象真的太过分了。

使用扩展实体

这第三个解决方案使用唯一的查询来获取提案、他们的赞成票、反对票,并检查用户是否赞成或反对。

它创建了一个新的“扩展”实体,

public function __construct(
    Proposal $badgeProposal,
    $upvotesCount,
    $downvotesCount,
    $hasUserUpvoted,
    $hasUserDownvoted
) {
Run Code Online (Sandbox Code Playgroud)

对我来说,这是更好的解决方案,但目前这行不通,因为我不知道如何简单地从 SQL 行中获取建议(但我几乎没有搜索)。

轮到你了

那么,还有什么其他解决方案呢?对于学说开发人员来说,是必须是一个众所周知的问题。

sql doctrine eager-loading symfony

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

"if"条件的位置

我以为:

do_something if condition
Run Code Online (Sandbox Code Playgroud)

相当于

if condition
  do_something
end
Run Code Online (Sandbox Code Playgroud)

我发现了一个不遵守这条规则的代码.

if !(defined? foo)
  foo = default_value
end
Run Code Online (Sandbox Code Playgroud)

在这里,foo需要default_value.

foo = default_value if !(defined? foo)
Run Code Online (Sandbox Code Playgroud)

在这里,foo需要nil.在以前的代码中,我认为if首先执行,并且应该等同于:

foo = (default_value if !(defined? foo))
Run Code Online (Sandbox Code Playgroud)

default_value如果没有定义变量,有没有办法设置?

一般答案:

有几条评论想要使用||=运算符......如果foonil:

foo ||= default_value
Run Code Online (Sandbox Code Playgroud)

foo定义时返回默认值.

我坚持使用"不defined?",这不等于nil.

ruby

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