我想定义3个类:
MotherClass
(摘要,无法推断)SubClassA
(继承自MotherClass
)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相同
不方便:命名MotherModule
和MotherClass
使用不同的名称,但它们的意思几乎相同
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中的最佳实践是什么? - 如何命名我的课程? - 他们的目录是什么?
我有一个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以"检查"选择值.然后,参数将直接在控制器中相同.什么解决方案不那么难看?或者还有其他的吗?
我最近开始使用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"选项不是这样做的,它只限制上面这个子集.
谢谢
我不确定它是否是一个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/rails问题在这里.我有一个方法,我目前在我的"用户"模型中使用.
def generate_token(column)
begin
self[column] = SecureRandom.urlsafe_base64
end while User.exists?(column => self[column])
end
我想在不同的模型中重用相同的方法,比如说我的帐户模型.
在这个模型之间共享这样的代码的好地方在哪里?另外,为了获得调用类,我只使用"self.class"?
谢谢
我想创建一个具有某些条件的范围,其中一个返回不是特定范围.目前,此解决方案有效:
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)
还有其他更好的解决方案吗?
问候
想象一组提案,其中每个用户都可以对提案投赞成票或反对票。
所以我有2个模型:
Proposal
,Vote
,与 a proposal
、 auser
和 an opinion
(向上或向下)相关。现在我想显示我的所有提案,包括每个提案的额外信息:
这真的很容易实现,但这意味着每个提案显示 4 个请求(称为 n+1 查询问题)。我来自 Rails 世界,在那里可以使用预先加载或一些棘手的查询轻松解决此问题。但是我无法用教义解决它,需要一些帮助!
第一种解决方案是进行自定义查询:选择所有提案,包括赞成票、反对票的数量,当前用户是否赞成或反对。
查询现在返回4分列比模型来描述:count_upvotes
,count_downvotes
,has_user_upvoted
和has_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 行中获取建议(但我几乎没有搜索)。
那么,还有什么其他解决方案呢?对于学说开发人员来说,是必须是一个众所周知的问题。
我以为:
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
如果没有定义变量,有没有办法设置?
一般答案:
有几条评论想要使用||=
运算符......如果foo
是nil
:
foo ||= default_value
Run Code Online (Sandbox Code Playgroud)
将foo
定义时返回默认值.
我坚持使用"不defined?
",这不等于nil
.