markdown Incluirvalidaçõesnos模型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown Incluirvalidaçõesnos模型相关的知识,希望对你有一定的参考价值。

## Incluindo validações nos Models ##

### Exemplo 1 ###

Quando o modelo possui uma relação já criada "references: model", para dizer ao rails que a relação
poderá conter vários registros, no modelo incluímos a seguinte linha:

```ruby
class Category < ApplicationRecord
  has_many :series, class_name: "Serie"
end
```
No caso, dizemos que na tabela Category poderão existir várias séries relacionadas à ela. Obs: o trecho "class_name" não é obrigatório, foi adicionado neste caso pois não existe "Series"
no plural no rails, portanto, deve-se informar dessa maneira.

Para adicionar a validação de fato, basta adiciona a linha abaixo:

```ruby
class Category < ApplicationRecord
  validates: name, presence: true, uniqueness: true
end
```
```text
validates: name (Informa que o campo nome terá uma validação).
presence: true (Verifica se o campo nome está presente, não é nulo).
uniqueness: true (Informa que o campo nome deverá ser único, ou seja, não poder haver outro registro com mesmo nome no banco de dados).
```

------------------

### Exemplo 2 ###

```ruby
class Serie < ApplicationRecord
  include PgSearch
  multisearchable against: [:title]
  belongs_to :category
  has_many :reviews, as: :reviewable
  has_many :episodes, ->{ order(:episode number) }, class_name: "Movie", dependent: :destroy
  belongs_to :last_watched_episode, class_name: "Movie", optional: true
  validates :title, presence: true
  validates :description, presence: true
  validates :thumbnail key, presence: true
end
```
```text
include PgSearch
multisearchable against: [:title]
```
Essas duas linhas são referentes à gem de pesquisa que foi instalada anteriormente, basicamente diz
que o modelo utilizará do método de busca mais avançado.

```text
dependent: :destroy
```
Essa linha informa que, caso uma série seja excluída, todos os episódios da mesma também serão, ou 
seja, é uma forma de exclusão em "cascata".

------------------

### Exemplo 3 ###

```ruby
class Movie < ApplicationRecord
  include PgSearch
  multisearchable against: [:title], if: lambda{ |record| record.serie.nil? }
  has_one :watched_serie, class_name: "Serie", foreign_key: "last watched episode id", dependent: nullify
  validates :episode_number, presence: true, uniqueness: { scope: :serie_id }, if: ->{ serie.present? }
  validates :category, presence: true, if: ->{ serie.nil? }
  validate :highlight_episode

  private 
    def highlight_episode
      if self.serie.present? && self.highlighted == true
        errors.add(:highlight_episode, "It's not possible to highlight an serie episode")
      end
    end

end
```

Observações:

```ruby
multisearchable against: [:title], if: lambda{ |record| record.serie.nil? }
```

Na linha acima, existe uma condição "if" para a busca... os resultados poderão ser somente de um filme
solto ou de uma série, a busca não deverá trazer episódios soltos de séries como resultado da busca.

```ruby
validates :episode_number, presence: true, uniqueness: { scope: :serie_id }, if: ->{ serie.present? }
```

Essa linha também contém uma condição "if" que, verifica se o "movie" pertence à uma série, ou seja,
se é um episódio de uma série, e caso seja, faz toda a validação necessária.

```ruby
validate :highlight_episode

  private 
    def highlight_episode
      if self.serie.present? && self.highlighted == true
        errors.add(:highlight_episode, "It's not possible to highlight an serie episode")
      end
    end
```

No código acima, existe um método um pouco mais complexo para um tipo de validação específico, e 
acima é chamado esse método de validação "validate :highlight_episode".

------------------

### Exemplo 4 ###

```ruby
class Player < ApplicationRecord
  belongs_to :movie
  belongs_to :user
  before_create :set start_date

  private 
    def set_start_date
      self.start_date ||= Time.zone.now
    end
end
```

Observações:

```ruby
before_create :set_start_date

  private 
    def set_start_date
      self.start_date ||= Time.zone.now
    end
```

No código acima, toda vez, antes de criar um record/player/registro no banco "before_create" é 
chamado um método/função "set_start_date" para adicionar automaticamente a hora atual no campo
start_date da tabela.

以上是关于markdown Incluirvalidaçõesnos模型的主要内容,如果未能解决你的问题,请参考以下文章

转换rst到markdown总结

markdown 用Swift 2.0编写的markdown-ish解析器

发布内容需要的Markdown语法

Markdown简易入门

Markdown中的Latex格式

Markdown Syntax 2.0