LoginSignup
0
0

More than 3 years have passed since last update.

Rails書き方

Last updated at Posted at 2020-10-09
# ダメな書き方
@incorrect_questions = session[:incorrect_question_ids].map { |n| Question.find(n.to_i) }

# なぜダメ?
# これだと件数ごとにQuestionを呼び出すクエリが発行されてしまって仮に100件あったら100件クエリが発行されてしまうのでこちらの方が良いかと。

# 良い書き方
@incorrect_questions = Question.where(id: session[:incorrect_question_ids].map(&:to_i))

Railsの考え方

・デフォルトに存在しないactionは別のcontrollerにした方が良い、というのがDHHの意見で、僕もそう思います。
・RESTとは?
・オブジェクトが自分自身の状態を持つのがオブジェクト指向の考え方の一つだよ。
・sessionを使うのは危険で、その人の状態をテーブルで用意しておけばいいのでは?
・Test◯◯という名前はrspecのファイルと勘違いされる可能性があるので避ける
・callback系(before_saveなど)は意図せずメソッドが走ったりするから、そこにロジックを書くのはあまり好ましくない。

# ダメな書き方
def index
  @questions = Question.all
end

#なぜダメ?
# 今の件数だと問題ないと思いますが、実際のサービスでallを使うとメモリが足りなくて落ちることがあるので気をつけた方が良いです。
基本的には動的に変わるデータ(例えばユーザーが追加するもの)はselect/pluckなどで必要なカラムを制限するように癖付けた方が良いかなと思います。
#ダメな書き方
<%= form_for(@question_similar, url: { controller: 'question_similar', action: 'create' }) do |f| %>

#ダメな理由
url: {〜〜〜} は xxx_path で書けそうですね
#ダメな書き方
 def cancel_save
    question_similars.each do |question_similar|
      if question_similar.similar_word == ""
        question_similar.delete
      end
    end
  end

#.blank使え
#トランザクション大丈夫?
#delete_all の方がパフォーマンスは良いと思います
params[:front_article_search_form][:heart_period]

こういうハッシュは2次元ハッシュていうのですが、
params[:front_article_search_form]がそもそもnilだと
undefined method `[]' for nil:NilClass (NoMethodError) みたいなエラーがよく起こる。
なので書き方を十分に気をつけなきゃいけないです。

わたしだったら

article_search_form = params[:front_article_search_form]
if article_search_form.present?
 @heart_period = article_search_form[:heart_period]
end
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0