Как мне описать отношения типа «проблема имеет статус» в Rails 3? - PullRequest
1 голос
/ 30 июня 2011

Я занимаюсь разработкой приложения для отслеживания проблем в Rails 3, но у меня возникают проблемы с описанием взаимосвязи между «Проблемой» и ее «Статусом».Каждая проблема может иметь только один статус - я бы хотел, чтобы это было поле со списком в HTML, - но каждый статус может быть назначен нескольким проблемам.Я начал с «проблема имеет один статус», но затем я столкнулся с проблемами при получении этого статуса в представлении.Я предполагаю, что это правильно, но мне нужно что-то еще ...

Ответы [ 3 ]

2 голосов
/ 30 июня 2011

В этом случае проблема принадлежит определенному статусу:

class Issue
  belongs_to :status
end

Думайте о статусе как о категории, к которой относится каждая проблема.

1 голос
/ 30 июня 2011

Вместо этого следует использовать Issue belongs_to :status и Status has_many :issues.

Когда вы используете ассоциацию has_one, Rails будет искать внешний ключ issue_id в таблице statuses.Это не то, что вы хотите.Вы хотите, чтобы вопросы указывали на статусы, а не наоборот.

1 голос
/ 30 июня 2011

Если вы не разрешаете настраивать пользовательский статус, имеет смысл иметь статус all 'в виде постоянного массива (используется для выбора) и строкового поля status в выпусках.Вы по-прежнему сможете перечислить все проблемы со статусом с областью действия.

Обновление для вопроса

class Issue
    STATUSES = [ "Open", "Closed" ]

    scope :with_status, lambda { |status| where(:status => [*status]) }
end

В поле зрения

<%= f.select :status, Issue::STATUSES %>

нужно поле в базе данных.Итак, при миграции:

add_column :issues, :status, :string

Чтобы найти проблемы со статусом в контроллере:

@open_issues = Issue.with_status("Open").all;
@current_issues = Issue.with_status([ "Pending", "Waiting on Review"]).all;

Или с ассоциацией:

@closed_issues = @project.issues.with_status("Closed");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...