我有网站和网页。网站有很多页面,每个页面都属于一个网站。最重要的是,我想指定一个页面作为每个站点的默认页面。我能想到的最有效的方法是在站点模型中保存默认页面ID。
这就是我所拥有的
#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
更新:
决定使用AR提供的default_page_id并添加
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 :(得分:0)
您应该在Site和Page模型中定义一些实例方法 在您的站点模型中:
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。