[英]Rails Best Practice: Constants for model ids, or find_by or where queries?
我遇到需要做出最佳实践决定的情况,这将影响我的系统的很大一部分。 has_many through:
有很多不同的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
。 我倾向于使用常量,因为这些ID在开发,测试和生产中显然会有所不同,并且只需要加载一次即可,而不是每次都搜索未索引的名称,这将是很好的选择。
1. #find_by(:name)
@user.skills.find_by(name: 'Ruby-on-Rails').present?
2. #where(“名称...”)
@user.skills.where("name = 'Ruby-on_rails'").present?
3.常量+ #find_by(:id) 常量将在应用程序加载时使用#const_set
动态设置,因此将始终存储200多个常量
RUBY_ON_RAILS = 41
RUBY = 42
PHP = 45
@user.skills.find_by(id: RUBY_ON_RAILS).present?
4.常量+ #pluck(:id) 与上面相同的常量
@user.skills.pluck(:id).include?(RUBY_ON_RAILS)
5。??? 我没有想到的更好的方法
有一个更好的方法可以做到这一点:
@user.skills.exists?(name: 'Ruby-on-Rails')
它也适用于一个关系:
@user.skills.where(name: 'Ruby-on-Rails').exists?
对于主题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?
编辑:错别字
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.