我有一种情况需要做出最佳实践决定,这会影响我系统的很大一部分。我将经常查询许多不同的has_many through:
关系,以查看特定项目是否存在并附加到另一项目。
class User
has_many :user_skills
has_many :skills, through: :user_skills
end
class Skill
has_many :user_skills
has_many :users, through: :user_skills
end
class UserSkill
belongs_to :skill
belongs_to :user
end
系统中将有数千个users
可以与任意数量的skills
组合,其中大约有200多个user
。我试图找出查询skill
以查明他/她是否拥有特定@user.skills.find_by(name: 'Ruby-on-Rails').present?
的最快,最有效的方法。我倾向于常量,因为在开发,测试和生产中ID显然会有所不同,而且每次只需加载一次而不是每次搜索非索引名称都会很好。
1。 #find_by(:name)
@user.skills.where("name = 'Ruby-on_rails'").present?
2。 #where('名称......')
#const_set
第3。常数+ #find_by(:id)
使用RUBY_ON_RAILS = 41
RUBY = 42
PHP = 45
@user.skills.find_by(id: RUBY_ON_RAILS).present?
在应用程序加载时动态设置常量,这样就会有超过200个常量存储
@user.skills.pluck(:id).include?(RUBY_ON_RAILS)
4。常数+ #pluck(:id) 与上述相同的常量
<div class="container" id="container">
<p id="captionRegion" class="captionRegion" style="width: 90%; height: 20%; left: 5%; top: 50%; padding: 0%; -webkit-writing-mode: horizontal-tb; text-align: center; background-color: blue;">
<span class="outerSpan" style="line-height: 18vh; text-align: end; display: inline-block; width: initial;">
<span class="innerSpan" style="font-size: 24px; line-height: 30px; color: rgb(255, 255, 255); font-style: normal; font-weight: normal; text-decoration: none; font-family: Arial; padding-left: 12.8px; padding-right: 12.8px; vertical-align: middle; width: 100%; background-color: rgb(100, 100, 100);">
This is center textAlign <br>
text aligned "end" inside the box.
</span>
</span>
</p>
</div>
5。 ??? 我想到的更好的方式
答案 0 :(得分:2)
有一种更好的方法:
@user.skills.exists?(name: 'Ruby-on-Rails')
它也适用于关系:
@user.skills.where(name: 'Ruby-on-Rails').exists?
答案 1 :(得分:1)
有关主题1的最佳做法,请勿使用“find_by”。范围是要走的路:
class Skill
scope :names, ->(*n) { #I always use plural form in my scopes
where(name: n.flatten.compact.uniq)
}
end
Skill.names("ruby-on-rails").exist?
Skill.names("ruby-on-rails").any?
Skill.names("ruby-on-rails").present?
编辑:错字