2012-02-04 3 views
0

Я пытаюсь добавить has_many_through отношения через форму, вложенную в родительскую модель. Я не могу понять, возможно ли это?Работа с has_many через флажки во вложенной форме

Вложенная форма работает нормально без флажков. И флажки отлично работают, когда они находятся вне вложенной формы.

= semantic_form_for @raduser do |f| 
    %ul  
    %li 
     = f.text_field :expiration, :placeholder => 'Expiration Date', :id => 'expiration_date' 
    - f.fields_for :radcheck do |builder| 
     = builder.text_field :username, :placeholder => 'Stuff' 
     -Radgroup.all.each do |group| 
     %li 
      = check_box_tag 'radcheck[radgroup_ids]', group.id, @radcheck.radgroup_ids.include?(group.id) 
      = group.groupname   

    %li 
     = f.submit 

Это выдает ошибку:

undefined method `radgroup_ids' for #<ActiveRecord::Relation:0x007faaa24c2468> 

У меня есть модели созданы нормально, я думаю, как все значения сохранять совершенно без флажков

--- EDIT ДОБАВЛЕНО МОДЕЛИ - -

У Radusers много Radcheck (единственное из-за устаревшего db). У Radcheck много радгрупп через radusergroup.

class Raduser < ActiveRecord::Base 

    has_many :radcheck, :dependent => :destroy 
    accepts_nested_attributes_for :radcheck, :reject_if => lambda { |a| a[:value].blank? }, :allow_destroy => true 

end 

class Radcheck < ActiveRecord::Base 
    self.table_name = 'radcheck' 

    attr_accessible :attribute_name, :username, :value, :op, :radgroupcheck_id, :radcheck_serial, :radgroup_ids 

    belongs_to :raduser 

    has_many :radusergroup, :dependent => :destroy 
    has_many :radgroup, :through => :radusergroup 

end 

class Radgroup < ActiveRecord::Base 
    self.table_name = 'radgroup' 

    has_many :radusergroup, :dependent => :destroy 
    has_many :radcheck, :through => :radusergroup 

end 


class Radusergroup < ActiveRecord::Base 

belongs_to :radcheck 
belongs_to :radgroup 

end 

- ОБНОВЛЕНИЕ TWO -

def new 
    @radcheck = Radcheck.new 
    ...  
end 

def create 
    @radcheck = Radcheck.new(params[:radcheck]) 
    ... 
end 

--- UPDATE 3 ---

Мой дб в настоящее время выглядит следующим образом:

+----------------+-----------------------+----------+------+ 
| radcheck_id | radgroup_id   | priority | id | 
+----------------+-----------------------+----------+------+ 
| 8    | 3      |  1 | 1 | 
| 4    | 9      |  0 | 2 | 
| 22    | 4      |  1 | 3 | 
| 2    | 6      |  1 | 4 | 

У меня есть решение предлагаемый ниже.

То, что я надеялся сделать, это вставить radcheck_username и radgroup_groupname в БД, а не radcheck_id:

+----------------+-----------------------+----------+------+ 
| ...username | --groupname   | priority | id | 
+----------------+-----------------------+----------+------+ 
| user123344  | group88888   |  1 | 1 | 
| shushQb  | 30-minutes   |  0 | 2 | 
| forty   | gigiig    |  1 | 3 | 
| snang   | ps-staff    |  1 | 4 | 

возможно ли это?

+0

Необходимо, чтобы увидеть ваши модели, если это возможно. – Ryan

+0

@Ryan, только что обновил мой вопрос. Спасибо – simonmorley

+0

A ** has_many: через ** не будет генерировать метод ** something_ids **. Почему у вас есть этот класс ** Radusergroup **? Есть ли полезная информация об этом или только идентификаторы? –

ответ

1

Проблема заключается в том, что вы пытаетесь получить доступ к различным Radgroups Radcheck с помощью метода, который еще не определен. Я вижу пару решений. Можно было бы добавить недостающую модель radgroup_ids к вашей модели. В качестве альтернативы, я думаю, вы могли бы назвать include? на Radchecks радгруппы отношение.

Раствор А

В классе Radcheck, определяет:

def radgroup_ids 
    radgroups.map(&:id) 
end 

Раствор B

сделать небольшие изменения, как вы проверяемым для включены Radgroups

@radcheck.radgroups.include?(group) 
+0

Прохладный, я проверю это. Спасибо – simonmorley

+0

Это похоже на работу. Можете ли вы сказать мне также, можно ли вставить другое значение, отличное от идентификатора? Я бы предпочел использовать имя пользователя (например). – simonmorley

+1

Если вы имеете в виду решение A, вы можете использовать ярлык to_proc (&: символ) для любого метода, который предоставляет радгруппа. Если это не то, что вы имеете в виду, то я не совсем уверен, что вы спрашиваете. Вы хотите, чтобы массив имен пользователей вышел из вашей коллекции радиогрупп, или вы пытаетесь использовать имя пользователя где-то в другом месте? Поскольку я не вижу фактическую базу данных, я не знаю, какие модели предоставляют какие свойства. – Ryan