What is the correct order of associations, areas, validations, etc. In Rails Models

Edited this old question to include the answer below: Rubocop has it https://github.com/rubocop-hq/rails-style-guide#macro-style-methods

Rails is the “Configuration Agreement”. However, I have not yet met a "standard" for the order of associations, scopes, inclusions, checks ... in Rails models. Take, for example, the following simplified product model:

class Product < ActiveRecord::Base mount_uploader :logo, AssetUploader acts_as_taggable paginates_per 50 include ActionView::Helpers::NumberHelper belongs_to :company validates_presence_of [:title, :price, :plu] scope :on_website, where(display: true) def display_price ... end end 

Is this the correct order? Maybe this is not so important for many people, but I personally think that it would be great if there was an agreement on this issue.

+10
source share
2 answers

Rubocop has https://github.com/rubocop-hq/rails-style-guide#macro-style-methods

 class User < ActiveRecord::Base # keep the default scope first (if any) default_scope { where(active: true) } # constants come up next COLORS = %w(red green blue) # afterwards we put attr related macros attr_accessor :formatted_date_of_birth attr_accessible :login, :first_name, :last_name, :email, :password # Rails 4+ enums after attr macros enum gender: { female: 0, male: 1 } # followed by association macros belongs_to :country has_many :authentications, dependent: :destroy # and validation macros validates :email, presence: true validates :username, presence: true validates :username, uniqueness: { case_sensitive: false } validates :username, format: { with: /\A[A-Za-z][A-Za-z0-9._-]{2,19}\z/ } validates :password, format: { with: /\A\S{8,128}\z/, allow_nil: true } # next we have callbacks before_save :cook before_save :update_username_lower # other macros (like devise's) should be placed after the callbacks ... end 
+1
source

There is no such agreement. But you can create it for your project and be compatible with it in all models. This is what I follow.

 class Model < ActiveRecord::Base #all mixins include Something extend Something #other stuff acts_as_taggable paginates #associations has_many :something belongs_to :something_else #validations validate_presence_of :something #scopes scope :something #instance methods def instance_method end #class methods def self.method end #private methods private def method2 end end 
+10
source

Source: https://habr.com/ru/post/946664/


All Articles