Rails最佳实践:模型ID的常量,或find_by或查询的位置?

时间:2015-06-22 14:32:17

标签: mysql ruby-on-rails ruby ruby-on-rails-4 activerecord

我有一种情况需要做出最佳实践决定,这会影响我系统的很大一部分。我将经常查询许多不同的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。 ??? 我想到的更好的方式

2 个答案:

答案 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? 

编辑:错字