Рельсы: has_many: через

Я пытаюсь понять, верен ли мой подход. У меня есть модель пользователя и модель компенсации. Мне нужно разрешить администратору приложения назначать компенсацию для каждой записи пользователя. Эта компенсация может меняться со временем, и я хочу отслеживать эти изменения. После некоторого исследования я подумал, что has_many =>: through - это способ приблизиться к этому, используя третью модель, называемую Payments, для объединения двух других, и внутри этой модели есть user_id и payment_id. У меня такой набор:

class User < ActiveRecord::Base

has_many :payments
has_many :compensations, :through => :payments


class Compensation < ActiveRecord::Base

has_many :payments
has_many :users, :through => :payments

class Payment < ActiveRecord::Base

has_many :Users
has_many :compensations

Мой первый вопрос: правильно ли я сказал, что это лучший подход, зная, чего я пытаюсь достичь? Мой второй вопрос: как проще всего включить раскрывающееся поле в форму (объединение из таблицы компенсации), которое будет заполнять Таблицу платежей? К сожалению, большинство обсуждений has_many: through, которые я рассмотрел, сосредоточены на моделях, а не на представлении.

Любая помощь будет оценена.


person user1648020    schedule 27.09.2012    source источник


Ответы (4)


class User < ActiveRecord::Base
 has_many :payments
 has_many :compensations, :through => :payments
end

class Compensation < ActiveRecord::Base
  has_many :payments
  has_many :users, :through => :payments
end

class Payment < ActiveRecord::Base
  belongs_to :user
  belongs_to :compensation
end

Попробуйте, это может быть полезно для вас. Больше информации. см. это видео - has_many-> through

person Dipak Panchal    schedule 27.09.2012
comment
Спасибо. Это была моя опечатка. Я действительно смотрел это видео, но, к сожалению, оно не помогло мне после создания отношений перейти к следующему шагу - заставить его работать с использованием представления, или, по крайней мере, я так не думал. Я еще раз посмотрю. - person user1648020; 27.09.2012

Не совсем понятно, какова ваша цель. Зачем пользователю много компенсаций? Почему компенсация будет иметь место для многих пользователей, и не будет ли какая-то конкретная компенсация для конкретного пользователя, получающего компенсацию? Я также не уверен, о какой форме вы говорите во втором вопросе.

Тем не менее, если вы хотите что-то похожее на приведенный выше код, вам просто нужно:

class User < ActiveRecord::Base
  has_and_belongs_to_many :compensations
end

class Compensation < ActiveRecord::Base
  has_and_belongs_to_many :users
end

Что касается раскрывающегося списка, поищите в помощниках Rails select. Извините, я не могу уточнить, опять же, я не совсем уверен, что вы пытаетесь сделать.

person Amit Kumar Gupta    schedule 27.09.2012
comment
Извините за непонятный пост. Возможно, это поможет, и я могу использовать неправильный метод. Администратор назначил пользователю A Компенсацию, скажем, 100 долларов. Эта компенсация будет использоваться для отображения в приложении. Через два месяца вознаграждение пользователя А будет увеличено администратором до 200 долларов. Если увеличение продолжится, я хотел бы иметь возможность отслеживать все, когда они произошли, и в определенный момент иметь возможность показать историю их возникновения. Я использовал has_many: through, потому что думал, что это метод, который вы должны были использовать, когда хотели сохранить исторические данные. - person user1648020; 27.09.2012
comment
Поскольку в базе данных есть несколько пользователей, я предположил, что связь была has_many в обе стороны --- Наконец, форма, о которой я говорил, - это форма, которая будет использоваться администратором для установки компенсации внутри профиля пользователя. - person user1648020; 27.09.2012
comment
Какими должны быть возможные значения в этом раскрывающемся списке, и будут ли они варьироваться от пользователя к пользователю? - person Amit Kumar Gupta; 27.09.2012
comment
Я надеялся получить значения динамически, если возможно, из таблицы компенсации. Эти значения будут одинаковыми для всех пользователей приложения, хотя, очевидно, разные значения будут назначаться разным пользователям в зависимости от выбора. - person user1648020; 27.09.2012

Я понял это, но пошел в другом направлении - пока я отказался от возможности отслеживать историю и создал раскрывающийся список динамиков с помощью collection_select -

person user1648020    schedule 28.09.2012

Ваш первый вопрос: правильно ли я сказал, что это лучший подход, зная, чего я пытаюсь достичь? Ответ: Это хороший подход, но вы можете использовать «полиморфные ассоциации» для более конкретных решений. Ваш второй вопрос: как проще всего включить в форму раскрывающееся поле (объединение из таблицы вознаграждения), которое будет заполнять Таблицу платежей?

Второй вопрос не очень ясен. Вы хотите отобразить значение какого-либо атрибута?

Если да, то следуйте моему примеру. Думаю, это тебе поможет.

contact.select: contactable, @ member.contacts.map {| r | [r.first_name, r.id]}

person pratik    schedule 28.09.2012