2016-09-16 15 views
5

Może brakuje mi czegoś fundamentalnego, ale nie mogę sprawić, że ActiveAdmin będzie pracował z sortowalną, mającą wiele relacji relacją, z możliwością tworzenia nowych rekordów.ActiveAdmin/Formtastic sortable has_many through relationship

więc podane następujące modele

class User < ActiveRecord::Base 

    has_many :user_videos 
    has_many :videos, through: :user_videos 

    accepts_nested_attributes_for :user_videos 
    accepts_nested_attributes_for :videos 

    ... 
end 

class UserVideo < ActiveRecord::Base 

    belongs_to :user 
    belongs_to :video 

    accepts_nested_attributes_for :video 

end 

class Video < ActiveRecord::Base 

    has_many :user_videos 
    has_many :users, through: :user_videos 

    ... 
end 

(przyznaję Rzucam accepts_nested_attributes_for wokół nieco w nadziei, że coś może działać)

i aktywna setup Admin coś takiego (oczywiście WIP):

f.inputs "User" do 
    f.has_many :user_videos, heading: 'Videos', sortable: :order, allow_destroy: true, new_record: 'New Record' do |v| 
    v.inputs for: :video do |video| 
     video.input :video_url 
    end 
    end 
    f.has_many :videos, heading: 'Videos', new_record: 'New Video' do |v| 
    v.input :video_url 
    end 
end 

f.actions 

pierwszy has_many sprawie stowarzyszenia :user_videos nie wydaje się do renderowania żadnych nakładów. Jeśli są tam zapisy, widzę, że video.input :video_url faktycznie zwraca znacznik li z label i input, jednak nic nie zostanie wyrenderowane na stronie. W przypadku nowych rekordów cały bit v.inputs nie jest uruchamiany (czy muszę najpierw utworzyć rekordy podrzędne?).

Drugi będzie działał w taki sposób, że będziesz mógł dodawać rekordy i aktualizować istniejące rekordy, jednak nie da się sortować, ponieważ kolumna order jest w modelu UserVideos. Włączam to bardziej jako ilustrację niż cokolwiek innego.

Jeśli ktoś ma jakieś wskazówki na ten temat, będą najbardziej cenione. :)

Odpowiedz

2

Ponieważ nikt nie był zainteresowany tym problemem, podjąłem inne podejście - zamiast próbować przekonać ActiveAdmin/Formtastic do pracy z istniejącą strukturą modelu, dodałem programy pobierające i ustawiające dla niezbędnego pola w modelu przecięcia.

class UserVideo < ActiveRecord::Base 

    belongs_to :user 
    belongs_to :video 

    validates_with VideoValidator 

    def video_url 
    self.video = Video.create if video.nil? 
    self.video.video_url 
    end 

    def video_url=(video_url) 
    self.video = Video.create if video.nil? 
    self.video.video_url = video_url 
    # Video url is set via Active Admin, AA will not call save on the video as it does not realise it's changed 
    self.video.save! if video.present? and video.valid? 
    end 

end 

Spowoduje to oznaczało, że aktywny Administrator nie musiał wiedzieć o modelu wideo, a może po prostu działać na modelu UserVideo:

f.has_many :user_videos, heading: 'Videos', sortable: :order, allow_destroy: true, new_record: 'New Record' do |v| 
    v.input :video_url, :hint => (v.object.video.embed_code unless v.object.nil? or v.object.video.nil?) 
    end 

Jeśli ktoś ma rzeczywiste rozwiązanie zamiast obejść , Chciałbym to usłyszeć, ale poza tym jest to możliwe rozwiązanie dla każdego, kto szuka odpowiedzi na ten sam problem.

Powiązane problemy