【问题标题】:Dual association between two ActiveRecord models两个 ActiveRecord 模型之间的双重关联
【发布时间】:2013-11-07 02:09:22
【问题描述】:

我有网站和网页。站点有很多页面,每个页面都属于一个站点。最重要的是,我想指定一个页面作为每个站点的默认页面。我能想到的最有效的方法是将默认页面 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"} %>

【问题讨论】:

    标签: ruby-on-rails activerecord associations form-helpers


    【解决方案1】:

    您应该在站点和页面模型中定义一些实例方法。
    在您的站点模型中:

    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

    【讨论】:

    • 我想知道有没有办法使用活动记录来创建界面...如果我找不到,我一定会使用这个选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多