Rails 3 find_or_create_by - PullRequest
       7

Rails 3 find_or_create_by

5 голосов
/ 05 октября 2011

Я подписан на http://railscasts.com/episodes/102-auto-complete-association

Все вроде нормально. Я пытаюсь создать счет, а также клиент на лету. Это работает. Все круто.

клиент принадлежит к учетной записи счет принадлежит к учетной записи счет принадлежит клиенту

Buuut, обе модели (Клиент и Счет-фактура) имеют обязательный атрибут: account_id.

Когда я пытаюсь создать нового клиента на лету, я получаю сообщение об ошибке :client_id: - can't be blank

Причина, по которой я получаю эту ошибку, заключается в том, что Клиент не может быть создан, потому что он требует account_id в модели Клиента. Если я удаляю эту строку validates :account_id, :presence => true в модели клиента, счет добавляется, но у клиента нет account_id.

У меня есть это в clients_controller.rb в действии create для установки значения по умолчанию @client.account_id = current_user.account_id

invoice.rb

validates :account_id, :presence => true
validates :client_id, :presence => true

def client_name
  client.name if client
end

def client_name=(name)
  self.client = Client.find_or_create_by_name(name) unless name.blank?
end

1 Ответ

4 голосов
/ 05 октября 2011

проверьте эти записи в интерфейсе запросов ActiveRecord для Rails 3.x:

http://guides.rubyonrails.org/active_record_querying.html (см. Раздел « 15 Динамические искатели »)

http://m.onkey.org/active-record-query-interface

Сначала вам нужно будет создать учетную запись, затем клиента, затем счет, иначе ваши проверки не пройдут.

Лучше всего создать клиента и счет-фактуру через их родителей, например ::

a = Account.find( current_user.account_id )

c = a.clients.create(:name => "new client")
a.save   # better "save" than sorry ;-)

c.invoices.create(:invoice_date => Time.now)
c.save

Я бы порекомендовал поиграть с этим в вашей базе данных разработки, используя консоль rails, так что вы почувствуете это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...