У меня есть сайты и страницы. Сайты имеют много страниц, и каждая страница принадлежит сайту. Кроме того, я хотел бы присвоить одну страницу по умолчанию для каждого сайта. Наиболее эффективным способом, который я могу думать об этом, является сохранение идентификатора страницы по умолчанию в модели сайта.Двойная связь между двумя моделями 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"} %>
Мне было интересно, есть ли способ использовать активную запись для создания интерфейса ... Если я не могу найти его, я обязательно использую этот параметр. – aaandre