2013-11-07 4 views
0

У меня есть сайты и страницы. Сайты имеют много страниц, и каждая страница принадлежит сайту. Кроме того, я хотел бы присвоить одну страницу по умолчанию для каждого сайта. Наиболее эффективным способом, который я могу думать об этом, является сохранение идентификатора страницы по умолчанию в модели сайта.Двойная связь между двумя моделями ActiveRecord

Вот что я

#schema 
create_table "pages", force: true do |t| 
    t.integer "site_id" 
    ... 

create_table "sites", force: true do |t| 
    t.integer "default_page_id" 
    ... 

#site.rb 
class Site < ActiveRecord::Base 
    has_many :pages 

#page.rb 
class Page < ActiveRecord::Base 
    belongs_to :site 

# this already works 

s = Site.new ... 
p1 = Page.new ... 
p2 = Page.new ... 

s.pages << p1 
s.pages << p2 

s.pages #=> should return the site's pages 
p1.site # => should return the site the page belongs to 

Как я могу сделать этот вид интерфейса работы? Или не стесняйтесь предлагать лучшую.

s.default_page = p1 

s.default_page #=> should return the site default page 

p1.default_on_site #=> should return the site where the page is default 

Update:

Решил пойти с default_page_id обеспечивается AR и добавить

def default_page 
    @default_page ||= if self.default_page_id 
    Page.where(id: self.default_page_id).first 
    else 
    nil 
    end 
end 

def default_page_url 
    self.default_page.nil? ? "" : self.default_page.url 
end 

, которая обеспечивает легкий доступ в представлении

# form_for @site 
<%= f.collection_select :default_page_id, @site.pages, :id, :url, {include_blank: true}, {class: "form-control"} %> 

ответ

0

Вы должны определить некоторые методы экземпляра на моделях вашего сайта и страницы.
В модели сайта:

Class Site 
    def set_default_page(dp) 
     self.default_page_id = dp.id 
    end 

    def get_default_page 
     Page.find(self.default_page_id) 
    end 
end 

В модели страницы:

Class Page 

    def default_on_site 
     self.site 
    end 

End 

Если вы хотите методы более обобщенного класса, вы должны проверить scopes.

+0

Мне было интересно, есть ли способ использовать активную запись для создания интерфейса ... Если я не могу найти его, я обязательно использую этот параметр. – aaandre

Смежные вопросы