【问题标题】:Rails: Calling one Model from another Model. Why is this not possible?Rails:从另一个模型调用一个模型。为什么这是不可能的?
【发布时间】:2014-04-28 18:30:49
【问题描述】:

我有以下型号...

class Room < ActiveRecord::Base
  belongs_to :hotel
  belongs_to :layout
  has_many :visits

  validates :number, presence: true
  validates :rate, presence: true
  validates :smoking, presence: true

  def self.rooms_with_smoking(smoking)
    self.where('smoking = ?', smoking)
  end

  def self.occupied_rooms(from_date, to_date) #24-26
    self.joins(:visits).where('date >= ? and date <= ?', from_date, to_date).uniq
  end

  def self.vacant_rooms(from_date, to_date)
    self.where.not(id: Room.occupied_rooms(from_date, to_date))
  end 

  def self.blahblah(occupancy_count, smoking, from_date, to_date)
    layouts = Layout.layouts_with_occupancy_count_gt(occupancy_count)
    Room.rooms_with_smoking(smoking).vacant_rooms(from_date, to_date).joins(layouts)
  end
end

blahblah 方法...

当我尝试从 irb 运行它时,我收到一个错误...“未知类:布局”

1) Room 不“知道”布局。我不能像这样使用另一个模型吗?我该怎么做。

2) 理论问题:是有一个大的方法定义来获取一些信息更好......还是有很多小的划分方法,并在一个方法中使用它们来获得更大的一块数据。比如……

一个“大”方法:

def self.find_rooms_with(occupancy_count, smoking, from_date, to_date)
    Room.vacant_rooms(from_date, to_date).joins(:layout).where('occupancy_count >= ?', occupancy_count).where('smoking = ?', smoking)
end  

绝不是大,但一切都重新编码。看起来它不会跟随 DRY 太久。

许多小方法:

  def self.blahblah(occupancy_count, smoking, from_date, to_date)
    layouts = Layout.layouts_with_occupancy_count_gt(occupancy_count)
    Room.rooms_with_smoking(smoking).vacant_rooms(from_date, to_date).joins(layouts)
  end

第二个更容易编码。它利用 3 个内置方法定义。但是,它对第一个性能有什么影响,还是不太理想?

编辑:回答下面的前两个 cmets...

当我只输入 Layout 或 ap Layout 时,我会得到整个 Layout 模型。

class Layout < ActiveRecord::Base {
                 :id => :integer,
        :description => :string,
    :occupancy_count => :integer,
         :created_at => :datetime,
         :updated_at => :datetime
}
 => nil 

irb,是的,我的意思是 Rails 控制台。完整的布局模型在这里...

class Layout < ActiveRecord::Base
    has_many :rooms

    validates :description, presence: true
    validates :occupancy_count, presence: true

    def self.layouts_with_occupancy_count(occupancy_count)
        self.where('occupancy_count = ?', occupancy_count)
    end

    def self.layouts_with_occupancy_count_gt(occupancy_count)
        self.where('occupancy_count >= ?', occupancy_count)
    end
end

【问题讨论】:

  • 您有 Layout 模型吗?当您说irb 时,您的意思是rails console
  • 是的,当您进入 Rails 控制台并输入 Layout 时会发生什么
  • 在上面的原始帖子中添加了这些问题的答案。
  • 我也有同样的问题。一件奇怪的事情是生产看到我创建的类,但在开发中我得到没有类定义的错误。

标签: ruby-on-rails activerecord dry


【解决方案1】:

1) 看来您没有声明 Layout 类。

belongs_to 类方法expects 一个对应的ActiveRecord 类被定义。默认情况下,它应该匹配方法名称(:layout 对应于Layout)。

【讨论】:

  • 所以我需要belongs_to :Layout 而不是belongs_to :layout?
  • 不,您的 belongs_to 方法调用似乎是正确的。并定义了 Layout 类。所以我会加入 derekyau 的问题:在控制台中输入 Layout 时会看到什么?
  • 我在原帖的编辑部分添加了我的回复,但我看到了我的布局类。据我所知,似乎还不错。我可以不打电话给 Room.blahblah。我是否需要先加入 Room and Layout,然后在加入的集合上调用 .blahblah?
  • @chrisP 这个问题看起来很奇怪,你能确认你在进入rails控制台之前创建了布局模型吗?如果没有,控制台的当前进程在没有reload! 命令的情况下是看不到的。
  • 还有一件事。您在blahblah 中使用joins 方法似乎很奇怪。你用 ActiveRecord::Relation layouts 参数调用它。但是 API (apidock.com/rails/v4.0.2/ActiveRecord/QueryMethods/joins) 假定要使用字符串或符号参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 2012-07-12
  • 2022-01-16
  • 1970-01-01
相关资源
最近更新 更多