繁体   English   中英

Rails最佳实践:模型ID或find_by的常量或在哪里查询?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM