0

サイトとページがあります。サイトには多くのページがあり、各ページはサイトに属しています。その上で、各サイトの既定のページを 1 つ割り当てたいと思います。これについて考えることができる最も効率的な方法は、既定のページ 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"} %>
4

1 に答える 1

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

あなたの Page モデルで:

Class Page

    def default_on_site
      self.site
    end

End

より一般化されたクラス メソッドが必要な場合は、scopesを確認してください。

于 2013-11-07T02:38:19.243 に答える