2013-03-18 5 views
0

Я новичок в RoR, и я пытаюсь написать запрос на вступление таблицы, восстановить все данные мне нужноИзвлечение данных из таблицы объединения

class User < ActiveRecord::Base 
    has_many :forms, :through => :user_forms 
end 

class Form < ActiveRecord::Base 
    has_many :users, :through => :user_forms 
end 

В моем контроллере я могу успешно получить все формы пользователь, как это:

User.find(params[:u]).forms 

который дает мне все формы объектов

Но, я хотел бы добавить новый столбец в моей присоединиться к таблице (user_forms), который указывает статус вида (близко,уже заполнены и т. д.).

Возможно ли изменить мой запрос, чтобы он мог также извлекать столбцы из таблицы user_forms?

+0

ли вы имеете в виду отфильтровать по статусу: «закрыть», «уже заполнены» и т.д.? – Zippie

ответ

1

это возможно. После того, как вы добавили status столбец user_forms, попробуйте следующее

>> user = User.first 
>> closed_forms = user.forms.where(user_forms: { status: 'closed' }) 

принять к сведению, что вам не нужно, чтобы добавить присоединяется потому, что позаботился о том, когда вы назвали user.forms.

UPDATE: добавить атрибут из таблицы user_forms к формам, попробуйте следующее

>> closed_forms = user.forms.select('forms.*, user_forms.status as status') 
>> closed_forms.first.status # should return the status of the form that is in the user_forms table 
+0

Вау, каждый день я открываю новый способ делать вещи в рельсах. Благодарю. Однако я хотел бы получить все формы, но со столбцом статуса (как в моем приложении, администратор должен иметь возможность видеть статус формы). – Olivier

+0

вы можете попробовать мой обновленный ответ? – jvnill

+0

Он отлично работает. Огромное спасибо! – Olivier

0

Во-первых, я думаю, что вы допустили ошибку.

Если у вас есть 2 модели, имеющие отношения has_many, вы должны установить отношение has_and_belongs_to_many.

В большинстве случаев, 2 модели соединены

  • has_many - belongs_to
  • has_one - belongs_to
  • has_and_belongs_to_many - has_and_belongs_to_many

has_and_belongs_to_many является одним из решений. Но, если вы выберете его, вы должны создать таблицу соединений с именем forms_users. Выберите has_and_belongs_to_many, что вы не можете установить статус в таблице соединений.

Для этого вам необходимо добавить таблицу соединений с формой form_id, user_id и статусом.

class User < ActiveRecord::Base 
    has_many :user_forms 
    has_many :forms, :through => :user_forms 
end 

class UserForm < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :form 
end 

class Form < ActiveRecord::Base 
    has_many :user_forms 
    has_many :users, :through => :user_forms 
end 

Затем, вы можете получить

User.find(params[:u]).user_forms 

Или

UserForm.find(:all, 
    :conditions => ["user_forms.user_id = ? AND user_forms.status = ?", 
    params[:u], 
    'close' 
) 
) 
+0

Я пытался играть с habtm, но я нашел его слишком ограничительным. Ваш запрос работает, но он извлекает объект UserForm, поэтому у меня нет всей информации в таблице форм (например, имя) – Olivier

1

Это можно сделать это с помощью find_by_sql и буквального SQL. Однако я не знаю, как правильно сгруппировать методы запросов рельсов для создания одного и того же запроса.

Но вот модифицированный пример, который я соединял для друга ранее:

@user = User.find(params[:u]) 
@forms = @user.forms.find_by_sql("SELECT forms.*, user_forms.status as status FROM forms INNER JOIN user_forms ON forms.id = user_forms.form_id WHERE (user_forms.user_id = #{@user.id});") 

И тогда вы будете в состоянии сделать

@forms.first.status 

, и он будет действовать как status только атрибут модели Form.

0

Учитывая, что статус действительно является свойством формы, вы, вероятно, хотите добавить статус в таблицу форм, а не в таблицу соединений.

Затем, когда вы извлекаете формы, используя запрос, они уже будут иметь информацию о состоянии извлеченной с ними, т.е.

User.find(params[:u]).forms.each{ |form| puts form.status } 

Кроме того, если вы хотите, чтобы найти все формы для данного пользователя с определенным статусом, вы можете использовать запросы как:

User.find(params[:u]).forms.where(status: 'closed')

+0

Статус относится как к пользователю, так и к форме (если пользователь заполнил форму для Exemple). – Olivier