Правильный способ принудительно установить уникальность для модели соединения? (has_many: through)

У меня есть отношения родитель / потомок через нашу таблицу пользователей с моделями как таковыми:

class User < ActiveRecord::Base

  # Parents relationship
  has_many :children_parents, :class_name => "ParentsChild", :foreign_key => "child_id", :dependent => :destroy
  has_many :parents, :through => :children_parents

  # Children relatiopnship
  has_many :parents_children, :class_name => "ParentsChild", :foreign_key => "parent_id", :dependent => :destroy
  has_many :children, :through => :parents_children
  ...
end

И в parent_child.rb:

class ParentsChild < ActiveRecord::Base

  belongs_to :parent, :class_name => "User"
  belongs_to :child, :class_name => "User"

end

Прямо сейчас это возможно в нашей форме «добавить потомков» (просто используя вложенные ванили атрибуты), чтобы несколько раз добавить одного и того же пользователя в качестве дочернего для родителей. Я не уверен, какой «правильный» способ добиться уникальности в отношениях ParentsChild, хотя я склоняюсь к уникальному индексу на (parent_id, child_id) на уровне базы данных (конечно, с использованием миграции ).

Я уверен, что мог бы также установить ограничения уникальности в методе UsersController :: update, но предпочел бы избегать изменения этого кода (прямо сейчас он вообще не ссылается на родителей / детей, благодаря вложенным атрибутам в форма / модель), если возможно. Меня больше всего беспокоит использование символа " - function (v, q) {...

я хочу назначить факторы, представляющие квантили. Таким образом, мне нужно, чтобы они были числовыми. - function (v, q) {...

я хочу назначить факторы, представляющие квантили. Таким образом, мне нужно, чтобы они были числовыми. Вот почему я написал следующую функцию, которая по сути является ответом на мою проблему:

qdum <- function(v,q){

qd = quantile(v,1:(q)/q)
v = as.data.frame(v)
v$b = 0
names(v) <- c("a","b")
i=1
for (i in 1:q){

    if(i == 1)
        v$b[ v$a < qd[1]] = 1
    else
        v$b[v$a > qd[i-1] & v$a <= qd[i]] = i
}

all = list(qd,v)
return(all)

    }

теперь вы можете смеяться :). Возвращенный список содержит переменную, которую можно использовать для присвоения каждому наблюдению соответствующего квантиля. У меня вопрос: есть ли способ лучше (более «родной» или «основной») сделать это? Я знаю о программе Quantcut (из пакета gtools), но, по крайней мере, с теми параметрами, которые я получил, у меня остались только эти неудобные (? - по крайней мере, для меня) пороги.

Приветствуются любые отзывы, которые помогают стать лучше!

8
задан Machavity 15 October 2018 в 19:39
поделиться