【问题标题】:Scope of the rails find_by_id methodrails find_by_id 方法的范围
【发布时间】:2012-04-17 00:08:49
【问题描述】:

假设我有一个带有两个模型PersonHouse 的rails 应用程序。每个Person 对象都有一个House_id 属性。

我想在我的Person 模型中定义以下方法:

def locate_house
  current_house_id = house.find_by_id(person)
end

但是我收到house 的未定义变量错误,如何确保它在范围内?

【问题讨论】:

  • 我真的很困惑你的locate_house 想要做什么。您可以通过person.house 获取相关房屋...
  • 这种情况下没有模型关联,'person'只有一个'house_id'属性。
  • 然后定义关系。看我的回答。

标签: ruby-on-rails ruby-on-rails-3.2


【解决方案1】:

您正在尝试重写已经内置到 Rails 中的内容。使用belongs_to 关系:

class Person < ActiveRecord::Base
    belongs_to :house
end

那么你可以这样做:

person.house

获取相关联的房子。

【讨论】:

  • 假设我通过 JSON 创建 Person 对象,并且我不使用嵌套模型,所以我唯一需要通过的是 house_id。如何确保使用正确的房子?
  • 如果您在任何地方填充 house_id,关系将保持不变。但要小心从表单中接受不受信任的数据并分配 id。这是一个安全漏洞。
  • (但如果 JSON 来自受信任的来源,那应该没问题)
  • @AndrewBarinov,刚刚意识到如果 Person 是具有 house_id 的那个,它应该是一个 belongs_to 关系,而不是一个 has_one。如果 House 有一个 person_id,那么它将是一个 has_one。修正了我的答案。
【解决方案2】:

您的模型--House--是一个需要大写的红宝石常量

def locate_house
  current_house_id = House.find_by_id(person)
end

【讨论】:

  • @Andrew,即使这是要走的路而不是定义关联(我无法想象为什么),请注意您正在将一个完整的对象分配给一个名称以结尾的变量_id。一种容易引起令人头疼的错误的方法。
  • 第二个“想象”位。严重地。 @Ben 的回答将为您省去无数麻烦。
【解决方案3】:

House 是一个常量,需要像其他人所说的那样使用大写字母,请查看 Rails Guides 中关于 Active Record 模型之间的关系。有很多可能的关系,有很多可能是您正在寻找的。因为,实际上,一个人可以拥有多个房子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 2011-08-19
    • 2020-06-14
    相关资源
    最近更新 更多